java – 从BufferedImage到SWT Image的转换

前端之家收集整理的这篇文章主要介绍了java – 从BufferedImage到SWT Image的转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
经过深思熟虑后,我发现了一些将Buffered Image转换为SWT图像的代码(暂不阅读它):
  1. public static ImageData convertToSWT(BufferedImage bufferedImage) {
  2. if (bufferedImage.getColorModel() instanceof DirectColorModel) {
  3. DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel();
  4. PaletteData palette = new PaletteData(
  5. colorModel.getRedMask(),colorModel.getGreenMask(),colorModel.getBlueMask()
  6. );
  7. ImageData data = new ImageData(
  8. bufferedImage.getWidth(),bufferedImage.getHeight(),colorModel.getPixelSize(),palette
  9. );
  10. WritableRaster raster = bufferedImage.getRaster();
  11. int[] pixelArray = new int[3];
  12. for (int y = 0; y < data.height; y++) {
  13. for (int x = 0; x < data.width; x++) {
  14. raster.getPixel(x,y,pixelArray);
  15. int pixel = palette.getPixel(
  16. new RGB(pixelArray[0],pixelArray[1],pixelArray[2])
  17. );
  18. data.setPixel(x,pixel);
  19. }
  20. }
  21. return data;
  22. } else if (bufferedImage.getColorModel() instanceof IndexColorModel) {
  23. IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel();
  24. int size = colorModel.getMapSize();
  25. byte[] reds = new byte[size];
  26. byte[] greens = new byte[size];
  27. byte[] blues = new byte[size];
  28. colorModel.getReds(reds);
  29. colorModel.getGreens(greens);
  30. colorModel.getBlues(blues);
  31. RGB[] rgbs = new RGB[size];
  32. for (int i = 0; i < rgbs.length; i++) {
  33. rgbs[i] = new RGB(reds[i] & 0xFF,greens[i] & 0xFF,blues[i] & 0xFF);
  34. }
  35. PaletteData palette = new PaletteData(rgbs);
  36. ImageData data = new ImageData(
  37. bufferedImage.getWidth(),palette
  38. );
  39. data.transparentPixel = colorModel.getTransparentPixel();
  40. WritableRaster raster = bufferedImage.getRaster();
  41. int[] pixelArray = new int[1];
  42. for (int y = 0; y < data.height; y++) {
  43. for (int x = 0; x < data.width; x++) {
  44. raster.getPixel(x,pixelArray);
  45. data.setPixel(x,pixelArray[0]);
  46. }
  47. }
  48. return data;
  49. }
  50. return null;
  51. }

(见于:http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ConvertsabufferedimagetoSWTImageData.htm).

我测试过它,它运行得很好.问题是我不理解它(我最好的猜测是它使用两者的原始数据接口来进行传输).在我看来,一个更简单的解决方案是将BufferedImage写入ByteArrayOutputStream,然后将其读回SWT Image withByteArrayInputStream.这个解决方案有什么问题吗?速度怎么样?

这种转换是必要的,因为所有图像大小调整库都用于AWT,但我用SWT显示图像.

谢谢!

解决方法

代码的复杂性主要是由于BufferedImage的两种可能的颜色模型.我不认为你可以在这方面有所改进.首先,使用中间Stream将要求两个图像系统具有通用格式,并且转换为/从Stream的转换肯定会比当前代码慢.

猜你在找的Java相关文章