「java加载动图」java实现动态图片
本篇文章给大家谈谈java加载动图,以及java实现动态图片对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
图片框架 - Glide加载webp动图流程解析
这里分两个部分:
ByteBufferWebpDecoder是最终webp动图资源解码器
先给出Glide加载webp动图的完整调用栈:
整个流程主要分三块:
load :通过RequestManager加载一个String 类型的model。
into:加载一个ImageView的目标控件作为target,然后通过RequestBuilder开始数据处理流程。
EngineJob以前的流程非常简单明确,这里着重看下DecodeJob部分的处理流程:
这里有个ModelLoader-LoadData-DataFetcher关系需要捋一下:
DecodeHelper.java
这里modelLoaders是在Registry中由ModelLoaderRegistry来获取所有的models。这里model对应ByteBufferFileLoader,由他执行buildLoadData。
ByteBufferFileLoader.java
而LoadData是ModelLoader的内部类,它的属性包括一个DataFetcher,它就是最终加载数据的地方。
那么总结一下:首先是获取对应数据源类型的ModelLoader,ModelLoader初始化一个LoadData,然后LoadData通过内部关联的DataFetcher来正真去执行加载数据的操作!
这里很显然对应的DataFetcher实例是LoadData初始化时传入的ByteBufferFetcher。回到SourceGenerator的startNext方法,最终调用ByteBufferFetcher的loadData。
当然这里数据获取的方式有很多种,有网络请求、有磁盘文件获取等等:
这里DataFetcher也可以自定义,举例:
Glide网络请求默认使用的是HttpUrlConnection,这里可以替换为Okhttp请求。
做法是:
创建对应的ModelLoader,并且自定义一个OkHttpStreamFetcher来实现Okhttp网络请求功能,同时通过Registry去替换组件:
这里基本上图片资源获取就介绍完了。
资源获取成功后,会通过callback.onDataReady(result)进行回调,这个callback是通过参数传入的loadData.fetcher.loadData(helper.getPriority(), this),这里的this就是SourceGenerator
SourceGenerator.java
这个cb是FetcherReadyCallback,在SourceGenerator初始化时传入
从SourceGenerator初始化出追这个cb,就是DecodeJob,这样最终获取的数据源通过两层callback传入了DecodeJob,准备进行解码处理。
DecodeJob.java
onDataFetcherReady() - decodeFromRetrievedData() -decodeFromData()-decodeFromFetcher()
这个流程没什么可分析的,直接到decodeFromFetcher
DecodeHelper.java
这里很显然又是去Registry拿的。如果有的话最终会返回一个LoadPath对象
继续往下走:
这里调用LoadPath的load方法,该方法调用loadWithExceptionList
LoadPath.java
这里获取了一个decodePath,然后调用它的decode方法去执行具体的解码工作了。debug一个看看这里path是什么
这里就是文章开头说的客户端自定义添加webp动图解码组件。具体解码处理留到下一篇分析。
好的,最后再来简单总结下整个流程:
上层Glide作为客户端调用的主入口,通过RequestManager以及RequestBuilder收集图片源model以及目标控件target,创建一个对应的request交给EngineJob线程池去处理这个request,DecodeJob作为一个执行线程接收这个request任务,然后交由Generator选择处理方式,包括缓存还是网络请求等,而它通过获取Registry注册的对应的ModelLoader-LoadData-DataFetcher最终去获取图片数据。然后由Generator回调给DecodeJob,DecodeJob通过向Registry获取对应的LoadPath,最终匹配到对应的解码器DecodePath去执行解码操作。
后面就是将通过onSourceReady层层回调返回到SingleRequest,最终为目标控件设置webp动图资源。
整个数据转换流程为:
求助,怎样在java窗体中添加gif动态图片
JLabel(Icon image)
创建具有指定图像的 JLabel 实例。
加载图片后,可以直接创建一个jlabel显示
java如何传输动态图片(GIF图片)?
实现思路:无论是何种类型,都是转换为流的形式进行的文件传输和存储。
可以通过BufferedReader 流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre = null;
OutputStreamWriter pw = null;//定义一个流
try {
String file = "D:/test/test.GIF";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
pw = new OutputStreamWriter(new FileOutputStream(“D:/New.GIF”),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.GIF”实例
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环
{
pw.write(str);//将要写入文件的内容,可以多次write
};
bre.close();
pw.close();//关闭流
备注:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
java动态绘图
01 package com.zuidaima.swing;
02
03 import java.awt.Color;
04 import java.awt.Graphics;
05 import java.awt.Image;
06 import java.awt.Toolkit;
07
08 import javax.swing.JFrame;
09
10 @SuppressWarnings("serial")
11 class Cardioid extends JFrame {
12 // 定义窗口大小
13 private static final int WIDTH = 480;
14 private static final int HEIGHT = 600;
15
16 // 获取屏幕大小
17 private static int WINDOW_WIDTH = Toolkit.getDefaultToolkit()
18 .getScreenSize().width;
19 private static int WINDOW_HEIGHT = Toolkit.getDefaultToolkit()
20 .getScreenSize().height;
21
22 // 构造函数
23 public Cardioid() {
24 // 设置窗口标题
25 super("❤形线");
26 // 设置背景色
27 this.setBackground(Color.BLACK);
28 // 设置窗口位置
29 this.setLocation((WINDOW_WIDTH - WIDTH) / 2,
30 (WINDOW_HEIGHT - HEIGHT) / 2);
31 // 设置窗口大小
32 this.setSize(WIDTH, HEIGHT);
33 // 设置窗口布局
34 this.setLayout(getLayout());
35 // 设置窗口可见
36 this.setVisible(true);
37 // 设置窗口默认关闭方式
38 this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
39 }
40
41 public void paint(Graphics g) {
42
43 double x, y, r; // 横纵坐标及半径
44 Image image = this.createImage(WIDTH, HEIGHT);
45 Graphics pic = image.getGraphics();
46
47 // 绘制图形
48 for (int i = 0; i 100; i++) {
49 for (int j = 0; j 100; j++) {
50 r = Math.PI / 45 + Math.PI / 45 * i
51 * (1 - Math.sin(Math.PI / 45 * j)) * 18;
52
53 x = r * Math.cos(Math.PI / 45 * j) * Math.sin(Math.PI / 45 * i)
54 + WIDTH / 2;
55
56 y = -r * Math.sin(Math.PI / 45 * j) + HEIGHT / 2;
57
58 pic.setColor(Color.MAGENTA);
59 pic.fillOval((int) x, (int) y, 2, 2);
60 }
61 // 生成图片
62 g.drawImage(image, 0, 0, this);
63
64 }
65
66 }
67
68 public static void main(String[] args) {
69
70 new Cardioid();
71 }
72
73 }
关于java加载动图和java实现动态图片的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。