我正在尝试编写一个SWT组件,它能够获取并绘制java.awt.BufferedImage的实例.我的问题是SWT的Image和AWT的BufferedImage是不兼容的:SWT组件无法绘制java.awt.Image,AWT / Swing组件无法绘制org.eclipse.swt.graphics.Image.
有几种方法试图以其他方式解决这个问题(也可能有一些变化,但基本上有这两种):
他们都有缺点,不符合我的期望:
>将SWT图像转换为BufferedImage的第一种方法是,由于为每个像素创建了一个新的RGB实例,导致大图像的性能较差.
>第二种方法在可用性方面存在一些缺点.请参阅链接文章末尾的“变通办法”.
这导致了我尽力编写一个组件(基于org.eclipse.swt.widgets.Canvas或org.eclipse.swt.widgets.Composite)的结论,该组件允许直接绘制BufferedImage而无需任何转换图片.
我的方法是逐个像素地绘制它.因此,我只需要获取GC的实例,逐行,从左到右遍历源BufferedImage,并使用GC.setForeground(Color color)和GC.drawPoint(int x,int y)绘制相应的Color.
首先,我为每个像素创建了一个新的Color实例,它使用了相当多的内存并增加了额外的延迟,因为新Color获取系统资源并为每个像素创建一个新对象也需要时间.
然后我尝试在绘制图像之前将所有可能的(24位)颜色预加载到数组中.这导致内存使用量激增(> = 600 MB),这在我尝试之前很明显,但我必须验证它.
仅缓存使用的颜色也会导致比需要的内存消耗更多.
我认为必须有一个更低级的方法,不需要那么多的内存,因为SWT能够绘制整个(SWT)图像而不消耗那么多的内存.
我会很感激任何想法或解决方案.