2011-06-27 15 views
7

Después de mucho buscar, encontré un trozo de código que convierte una BufferedImage a un SWT imagen (no se molestan en leer todavía):BufferedImage a SWT imagen

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; 
} 

(encontrado aquí: http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ConvertsabufferedimagetoSWTImageData.htm) .

Lo he probado y funciona muy bien. El problema es que no lo entiendo (mi mejor opción es que usa las interfaces de datos sin procesar de ambos para realizar la transferencia). Se me ocurrió que una solución mucho más simple sería escribir el BufferedImage en ByteArrayOutputStream, y luego volver a leerlo en una Imagen SWT con ByteArrayInputStream. ¿Hay algún problema con esta solución? ¿Qué hay de la velocidad?

Esta conversión es necesaria porque todas las bibliotecas de cambio de tamaño de la imagen son para AWT y, sin embargo, estoy mostrando la imagen con SWT.

Gracias!

Respuesta

6

La complejidad del código se debe principalmente a los dos posibles modelos de color de BufferedImage. No creo que puedas mejorar mucho en esto. En primer lugar, el uso de un intermedio Stream requerirá que los dos sistemas de imágenes tengan un formato común, y la conversión a/desde un Stream definitivamente va a ser mucho más lenta que el código actual.

+0

Gracias, eso responde perfectamente mi pregunta. – Jonah

5

Esta es una versión más completa ... La publicada en la pregunta no funciona para mí.

/** 
* 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

Por curiosidad, ¿de dónde sacaste esta versión completa? – Galabyca

+1

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

Cuestiones relacionadas