変換

2011-06-27 8 views
7

あまり見た後、私はSWTイメージにBufferedImageを変換するコードのビットを発見した(まだそれを読んで気にしないでください):変換

public static ImageData convertToSWT(BufferedImage bufferedImage) { 
    if (bufferedImage.getColorModel() instanceof DirectColorModel) { 
     DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel(); 
     PaletteData palette = new PaletteData(
      colorModel.getRedMask(), 
      colorModel.getGreenMask(), 
      colorModel.getBlueMask() 
     ); 
     ImageData data = new ImageData(
      bufferedImage.getWidth(), 
      bufferedImage.getHeight(), colorModel.getPixelSize(), 
      palette 
     ); 
     WritableRaster raster = bufferedImage.getRaster(); 
     int[] pixelArray = new int[3]; 
     for (int y = 0; y < data.height; y++) { 
      for (int x = 0; x < data.width; x++) { 
       raster.getPixel(x, y, pixelArray); 
       int pixel = palette.getPixel(
        new RGB(pixelArray[0], pixelArray[1], pixelArray[2]) 
       ); 
       data.setPixel(x, y, pixel); 
      } 
     } 
     return data; 
    } else if (bufferedImage.getColorModel() instanceof IndexColorModel) { 
     IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel(); 
     int size = colorModel.getMapSize(); 
     byte[] reds = new byte[size]; 
     byte[] greens = new byte[size]; 
     byte[] blues = new byte[size]; 
     colorModel.getReds(reds); 
     colorModel.getGreens(greens); 
     colorModel.getBlues(blues); 
     RGB[] rgbs = new RGB[size]; 
     for (int i = 0; i < rgbs.length; i++) { 
      rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF); 
     } 
     PaletteData palette = new PaletteData(rgbs); 
     ImageData data = new ImageData(
      bufferedImage.getWidth(), 
      bufferedImage.getHeight(), 
      colorModel.getPixelSize(), 
      palette 
     ); 
     data.transparentPixel = colorModel.getTransparentPixel(); 
     WritableRaster raster = bufferedImage.getRaster(); 
     int[] pixelArray = new int[1]; 
     for (int y = 0; y < data.height; y++) { 
      for (int x = 0; x < data.width; x++) { 
       raster.getPixel(x, y, pixelArray); 
       data.setPixel(x, y, pixelArray[0]); 
      } 
     } 
     return data; 
    } 
    return null; 
} 

(ここで見つける:http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ConvertsabufferedimagetoSWTImageData.htmを) 。

私はそれをテストしたところ、うまく動作します。問題は私がそれを理解していないことです(私の推測では、両者の生データインターフェイスを使って転送することです)。 BufferedImageByteArrayOutputStreamに書き出してから、ByteArrayInputStreamのSWTイメージに戻すことが、もっと簡単な解決策になることが私にはありました。このソリューションに問題はありますか?スピードはどうですか?

この変換は、イメージリサイズライブラリがすべてAWT用であり、SWTでイメージを表示しているため、この変換が必要です。

ありがとうございます!

答えて

6

コードの複雑さは、主にBufferedImageの2つの可能なカラーモデルによるものです。私はあなたがこれについて多くを改善できるとは思わない。まず第一に、中間の使用は、2つのイメージシステムが共通のフォーマットを必要とし、Streamへの変換は間違いなく現在のコードより遅くなるでしょう。

+0

ありがとう、それは私の質問に完全に答えます。 – Jonah

5

これはより完全なバージョンです...質問に投稿されたものは私のためには機能しません。

/** 
* snippet 156: convert between SWT Image and AWT BufferedImage. 
* <p> 
* For a list of all SWT example snippets see 
* http://www.eclipse.org/swt/snippets/ 
*/ 
public static ImageData convertToSWT(BufferedImage bufferedImage) { 
    if (bufferedImage.getColorModel() instanceof DirectColorModel) { 
     /* 
     DirectColorModel colorModel = (DirectColorModel)bufferedImage.getColorModel(); 
     PaletteData palette = new PaletteData(
       colorModel.getRedMask(), 
       colorModel.getGreenMask(), 
       colorModel.getBlueMask()); 
     ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), 
       colorModel.getPixelSize(), palette); 
     WritableRaster raster = bufferedImage.getRaster(); 
     int[] pixelArray = new int[3]; 
     for (int y = 0; y < data.height; y++) { 
      for (int x = 0; x < data.width; x++) { 
       raster.getPixel(x, y, pixelArray); 
       int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2])); 
       data.setPixel(x, y, pixel); 
      } 
     } 
     */ 
     DirectColorModel colorModel = (DirectColorModel)bufferedImage.getColorModel(); 
     PaletteData palette = new PaletteData(
       colorModel.getRedMask(), 
       colorModel.getGreenMask(), 
       colorModel.getBlueMask()); 
     ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), 
       colorModel.getPixelSize(), palette); 
     for (int y = 0; y < data.height; y++) { 
      for (int x = 0; x < data.width; x++) { 
       int rgb = bufferedImage.getRGB(x, y); 
       int pixel = palette.getPixel(new RGB((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF)); 
       data.setPixel(x, y, pixel); 
       if (colorModel.hasAlpha()) { 
        data.setAlpha(x, y, (rgb >> 24) & 0xFF); 
       } 
      } 
     } 
     return data; 
    } 
    else if (bufferedImage.getColorModel() instanceof IndexColorModel) { 
     IndexColorModel colorModel = (IndexColorModel)bufferedImage.getColorModel(); 
     int size = colorModel.getMapSize(); 
     byte[] reds = new byte[size]; 
     byte[] greens = new byte[size]; 
     byte[] blues = new byte[size]; 
     colorModel.getReds(reds); 
     colorModel.getGreens(greens); 
     colorModel.getBlues(blues); 
     RGB[] rgbs = new RGB[size]; 
     for (int i = 0; i < rgbs.length; i++) { 
      rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF); 
     } 
     PaletteData palette = new PaletteData(rgbs); 
     ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), 
       colorModel.getPixelSize(), palette); 
     data.transparentPixel = colorModel.getTransparentPixel(); 
     WritableRaster raster = bufferedImage.getRaster(); 
     int[] pixelArray = new int[1]; 
     for (int y = 0; y < data.height; y++) { 
      for (int x = 0; x < data.width; x++) { 
       raster.getPixel(x, y, pixelArray); 
       data.setPixel(x, y, pixelArray[0]); 
      } 
     } 
     return data; 
    } 
    else if (bufferedImage.getColorModel() instanceof ComponentColorModel) { 
     ComponentColorModel colorModel = (ComponentColorModel)bufferedImage.getColorModel(); 
     //ASSUMES: 3 BYTE BGR IMAGE TYPE 
     PaletteData palette = new PaletteData(0x0000FF, 0x00FF00,0xFF0000); 
     ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), 
       colorModel.getPixelSize(), palette); 
     //This is valid because we are using a 3-byte Data model with no transparent pixels 
     data.transparentPixel = -1; 
     WritableRaster raster = bufferedImage.getRaster(); 
     int[] pixelArray = new int[3]; 
     for (int y = 0; y < data.height; y++) { 
      for (int x = 0; x < data.width; x++) { 
       raster.getPixel(x, y, pixelArray); 
       int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2])); 
       data.setPixel(x, y, pixel); 
      } 
     } 
     return data; 
    } 
    return null; 
} 
+0

好奇心で、どこでこの完成版を手に入れましたか? – Galabyca

+1

http://www.eclipse.org/swt/snippets – marcolopes