gpt4 book ai didi

java - 比 ColorConvertOp 更快的替代品

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:20 24 4
gpt4 key购买 nike

我有一个方法可以将类型为 TYPE_CUSTOM 的 BufferedImages 转换为 TYPE_INT_RGB。我正在使用以下代码,但我真的很想找到一种更快的方法。

BufferedImage newImg = new BufferedImage(
src.getWidth(),
src.getHeight(),
BufferedImage.TYPE_INT_RGB);

ColorConvertOp op = new ColorConvertOp(null);
op.filter(src, newImg);

它工作正常,但是速度很慢,我想知道是否有更快的方法来进行这种转换。

转换前的颜色模型:

ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@1c92586f transparency = 1 has alpha = false isAlphaPre = false

转换后的颜色模型:

DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0

谢谢!


更新:

事实证明,使用原始像素数据是最好的方法。由于 TYPE_CUSTOM 实际上是 RGB 手动转换很简单,并且比 ColorConvertOp 快大约 95%。

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

最佳答案

BufferedImages 非常慢。我有一个解决方案,但我不确定你会喜欢它。处理和转换缓冲图像的最快方法是从 BufferedImage 中提取原始数据数组。您可以通过调用 buffImg.getRaster() 并将其转换为特定栅格来实现。然后调用 raster.getDataStorage()。一旦您可以访问原始数据,就可以编写快速图像处理代码,而不会因为 BufferedImages 中的所有抽象而减慢速度。此技术还需要对图像格式有深入的了解,并且您需要进行一些逆向工程。这是我能够让图像处理代码足够快地运行我的应用程序的唯一方法。

例子:

ByteInterleavedRaster srcRaster = (ByteInterleavedRaster)src.getRaster();
byte srcData[] = srcRaster.getDataStorage();

IntegerInterleavedRaster dstRaster = (IntegerInterleavedRaster)dst.getRaster();
int dstData[] = dstRaster.getDataStorage();

dstData[0] = srcData[0] << 16 | srcData[1] << 8 | srcData[2];

或类似的东西。预计编译器错误会警告您不要访问那样的低级栅格。我唯一遇到这种技术问题的地方是在小程序内部,那里会发生访问冲突。

关于java - 比 ColorConvertOp 更快的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8744441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com