在SWT画布上绘制AWT BufferedImage

vor

我正在尝试编写一个SWT组件,该组件能够获取和绘制的实例java.awt.BufferedImage我的问题是SWTImage和AWTBufferedImage不兼容:SWT组件无法绘制java.awt.Image,AWT / Swing组件无法绘制org.eclipse.swt.graphics.Image

有几种方法可以尝试以其他方式解决此问题(也可能会有一些变化,但是基本上有这两种):

  1. 在SWT图像和AWT BufferedImage之间转换
  2. Swing / SWT集成

他们都有缺点,没有满足我的期望:

  1. 第一种方法将SWT转换ImageBufferedImage,由于RGB为每个Pixel创建一个新实例,导致大图像的性能较差
  2. 第二种方法在可用性上有几个缺点。请参阅链接文章末尾的“解决方法”。

由此得出的结论是,我将尽力编写一个组件(基于org.eclipse.swt.widgets.Canvasorg.eclipse.swt.widgets.Composite),该组件允许BufferedImage直接绘制图像而无需任何图像转换。

我的方法是逐像素绘制它。因此,我只需要获取一个实例GCBufferedImage一行一行地从左到右移动源代码,并Color使用GC.setForeground(Color color)绘制相应的内容GC.drawPoint(int x, int y)

首先,我Color为每个像素创建了一个新实例,该实例占用了大量内存并增加了额外的延迟,因为这需要new Color获取系统资源,并且为每个像素创建一个新对象也需要花费时间。

然后,我尝试Color在绘制图像之前将所有可能的(24位)预加载到数组中。这导致内存使用量激增(> = 600 MB),这在我尝试之前很明显,但是我必须对其进行验证。

仅缓存使用过的颜色也会导致比所需更多的内存消耗。

我认为必须有一种不需要太多内存的低层方法,因为SWT可以绘制整个(SWT)Image而不消耗太多内存。

我将不胜感激任何想法或解决方案。

vor

我发现有一种方法“转换”的BufferedImage一个Image使用,如果它是24位的RGB原始图像的数据缓冲。这是可能的,因为图像格式兼容。

final BufferedImage original = ImageIO.read(new File("some-image.jpg");

final PaletteData palette =
        new PaletteData(0x0000FF, 0x00FF00, 0xFF0000);

// the last argument contains the byte[] with the image data
final ImageData data = new ImageData(original.getWidth(), original.getHeight(),
        24, palette, 4,
        ((DataBufferByte) original.getData().getDataBuffer()).getData());

final Image converted = new Image(getDevice(), data);

这样,不必创建数千个新对象。这种方法的缺点是需要确保原始图像为RGB 24位类型。否则,图像必须转换为这种格式。

之后,可以使用以下代码绘制图像:

// get the GC of your component
gc.drawImage(image, 0, 0);

可能其他比特深度也可以类似的方式转换,但这只是我目前需要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何向JPanel绘制BufferedImage

来自分类Dev

Java bufferedImage真的给黑色画布吗?

来自分类Dev

java bufferedImage真的给黑色画布吗?

来自分类Dev

Robolectric&Gradle:错误:无法访问java.awt.image.BufferedImage的BufferedImage类文件

来自分类Dev

BufferedImage仅显示在JPanel的1/3上

来自分类Dev

在swt画布上绘制多个矩形

来自分类Dev

无法将 BufferedImage 绘制到另一个具有比例的 BufferedImage 中

来自分类Dev

Android替代java.awt(BufferedImage和Raster)

来自分类Dev

使用SwingFXUtils将BufferedImage(awt)转换为Image(JavaFx)

来自分类Dev

将位图转换为java.awt.image.BufferedImage

来自分类Dev

在Java BufferedImage中绘制完全透明的“白色”

来自分类Dev

Java Graphics2D绘制到BufferedImage中

来自分类Dev

在Java中重新绘制BufferedImage不会更改面板的内容

来自分类Dev

为什么我的JPanel无法绘制我的BufferedImage?

来自分类Dev

如何将一个BufferedImage绘制到JPanel

来自分类Dev

Java Graphics2D绘制到BufferedImage中

来自分类Dev

如何使用BufferedImage在java中绘制透明图像?

来自分类Dev

在BufferedImage上绘制具有不透明度的圆角矩形

来自分类Dev

创建bufferedimage仅保存面板背景,而不保存其上绘制的内容

来自分类Dev

TIFF到BufferedImage-Mac上的Eclipse上的JAI

来自分类Dev

Java BufferedImage.setRGB在类型13的图像上给出灰度?

来自分类Dev

错误:无法将sun.awt.image.ToolkitImage强制转换为java.awt.image.BufferedImage

来自分类Dev

BufferedImage类

来自分类Dev

刷新BufferedImage

来自分类Dev

BufferedImage的LinkedList

来自分类Dev

java.awt.image.BufferedImage的二进制规则是什么

来自分类Dev

java.awt.image.BufferedImage.getRBG不返回期望值

来自分类Dev

CodenameOne中的java.awt.image.BufferedImage的替代方案是什么

来自分类Dev

BufferedImage如何停止所有图像具有最后一个绘制的颜色

Related 相关文章

  1. 1

    如何向JPanel绘制BufferedImage

  2. 2

    Java bufferedImage真的给黑色画布吗?

  3. 3

    java bufferedImage真的给黑色画布吗?

  4. 4

    Robolectric&Gradle:错误:无法访问java.awt.image.BufferedImage的BufferedImage类文件

  5. 5

    BufferedImage仅显示在JPanel的1/3上

  6. 6

    在swt画布上绘制多个矩形

  7. 7

    无法将 BufferedImage 绘制到另一个具有比例的 BufferedImage 中

  8. 8

    Android替代java.awt(BufferedImage和Raster)

  9. 9

    使用SwingFXUtils将BufferedImage(awt)转换为Image(JavaFx)

  10. 10

    将位图转换为java.awt.image.BufferedImage

  11. 11

    在Java BufferedImage中绘制完全透明的“白色”

  12. 12

    Java Graphics2D绘制到BufferedImage中

  13. 13

    在Java中重新绘制BufferedImage不会更改面板的内容

  14. 14

    为什么我的JPanel无法绘制我的BufferedImage?

  15. 15

    如何将一个BufferedImage绘制到JPanel

  16. 16

    Java Graphics2D绘制到BufferedImage中

  17. 17

    如何使用BufferedImage在java中绘制透明图像?

  18. 18

    在BufferedImage上绘制具有不透明度的圆角矩形

  19. 19

    创建bufferedimage仅保存面板背景,而不保存其上绘制的内容

  20. 20

    TIFF到BufferedImage-Mac上的Eclipse上的JAI

  21. 21

    Java BufferedImage.setRGB在类型13的图像上给出灰度?

  22. 22

    错误:无法将sun.awt.image.ToolkitImage强制转换为java.awt.image.BufferedImage

  23. 23

    BufferedImage类

  24. 24

    刷新BufferedImage

  25. 25

    BufferedImage的LinkedList

  26. 26

    java.awt.image.BufferedImage的二进制规则是什么

  27. 27

    java.awt.image.BufferedImage.getRBG不返回期望值

  28. 28

    CodenameOne中的java.awt.image.BufferedImage的替代方案是什么

  29. 29

    BufferedImage如何停止所有图像具有最后一个绘制的颜色

热门标签

归档