2011-06-27 24 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 छवि में वापस पढ़ें। क्या इस समाधान के साथ कोई समस्या है? गति के बारे में क्या?

यह रूपांतरण आवश्यक है क्योंकि सभी छवि आकार बदलने वाले पुस्तकालयों में एडब्ल्यूटी के लिए हैं, और फिर भी मैं एसडब्ल्यूटी के साथ छवि प्रदर्शित कर रहा हूं।

धन्यवाद!

उत्तर

6

कोड की जटिलता मुख्य रूप से BufferedImage के दो संभावित रंग मॉडल के कारण है। मुझे नहीं लगता कि आप इस पर ज्यादा सुधार कर सकते हैं। सबसे पहले, इंटरमीडिएट Stream के उपयोग के लिए दो छवि प्रणालियों के एक सामान्य प्रारूप की आवश्यकता होगी, और 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