Po niecierpliwością, znalazłem kawałek kodu, który konwertuje BufferedImage
do SWT obrazu (nie przeszkadza czytanie go jeszcze):Konwersja z BufferedImage do SWT obrazu
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;
}
(tutaj: http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ConvertsabufferedimagetoSWTImageData.htm) .
Przetestowałem to i działa dobrze. Problem polega na tym, że go nie rozumiem (przypuszczam, że używa on nieprzetworzonych interfejsów danych do wykonania transferu). Przyszło mi do głowy, że znacznie prostszym rozwiązaniem byłoby napisanie BufferedImage
na ByteArrayOutputStream
, a następnie odczytanie go z powrotem na obrazie SWT z numerem ByteArrayInputStream
. Czy są jakieś problemy z tym rozwiązaniem? A co z prędkością?
Konwersja jest konieczna, ponieważ wszystkie biblioteki zmiany rozmiaru obrazków są dostępne dla AWT, a mimo to wyświetlam obraz z SWT.
Dzięki!
Dzięki, że doskonale odpowiada na moje pytanie. – Jonah