Tengo un método que convierte BufferedImages cuyo tipo es TYPE_CUSTOM en TYPE_INT_RGB. Estoy usando el siguiente código, sin embargo, me gustaría encontrar una forma más rápida de hacerlo.Alternativa más rápida a ColorConvertOp
BufferedImage newImg = new BufferedImage(
src.getWidth(),
src.getHeight(),
BufferedImage.TYPE_INT_RGB);
ColorConvertOp op = new ColorConvertOp(null);
op.filter(src, newImg);
Trabaja muy bien, sin embargo, es bastante lento y me pregunto si hay una manera más rápida de hacer esta conversión.
ColorModel antes de la conversión:
ColorModel: #pixelBits = 24 numComponents = 3 color space = [email protected] transparency = 1 has alpha = false isAlphaPre = false
ColorModel después de la conversión:
DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
Gracias!
Actualización:
Resulta que el trabajo con los datos de píxeles prima era la mejor manera. Dado que TYPE_CUSTOM era en realidad una conversión RGB manualmente, es simple y es aproximadamente un 95% más rápido que ColorConvertOp.
public static BufferedImage makeCompatible(BufferedImage img) throws IOException {
// Allocate the new image
BufferedImage dstImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
// Check if the ColorSpace is RGB and the TransferType is BYTE.
// Otherwise this fast method does not work as expected
ColorModel cm = img.getColorModel();
if (cm.getColorSpace().getType() == ColorSpace.TYPE_RGB && img.getRaster().getTransferType() == DataBuffer.TYPE_BYTE) {
//Allocate arrays
int len = img.getWidth()*img.getHeight();
byte[] src = new byte[len*3];
int[] dst = new int[len];
// Read the src image data into the array
img.getRaster().getDataElements(0, 0, img.getWidth(), img.getHeight(), src);
// Convert to INT_RGB
int j = 0;
for (int i=0; i<len; i++) {
dst[i] = (((int)src[j++] & 0xFF) << 16) |
(((int)src[j++] & 0xFF) << 8) |
(((int)src[j++] & 0xFF));
}
// Set the dst image data
dstImage.getRaster().setDataElements(0, 0, img.getWidth(), img.getHeight(), dst);
return dstImage;
}
ColorConvertOp op = new ColorConvertOp(null);
op.filter(img, dstImage);
return dstImage;
}
¡Hermoso! Trabajar con los datos sin procesar reduce el tiempo de procesamiento en un 95%. Ver la publicación editada para saber exactamente cómo terminé haciendo esto. –
No terminé usando las clases ByteInterleavedRaster e IntegerInterleavedRaster porque, por alguna razón, no tengo los paquetes Sun. –
Holy crap Acabo de pasar de procesar un archivo de 100MB + psd durante 10 minutos a 8 segundos. ¡Gracias! – EdgeCaseBerg