「java加载动图」java实现动态图片

博主:adminadmin 2023-01-11 06:09:07 1274

本篇文章给大家谈谈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实现动态图片的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。