gpt4 book ai didi

java - 有没有更快的方法来遍历java中的BufferedImage的像素?

转载 作者:行者123 更新时间:2023-12-02 03:43:00 25 4
gpt4 key购买 nike

我有一个程序需要经常逐像素地检查 BufferedImages。通常情况下,效率对我来说并不重要,但我真的想要我能得到的每一毫秒。

举个例子,目前,我发现的隔离图像中红色 channel 的最快方法如下所示:

    int[] rgb = image.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());


for(int i = 0; i < rgb.length; i ++)
rgb[i] = rgb[i] & 0xFFFF0000;

image.setRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0, img.getWidth());

这意味着它会遍历图像一次以填充数组,再次应用过滤器,最后第三次更新像素。另外考虑到任何 alpha channel 为 0 的像素都会完全归零,它也必须至少再经历一次。

我还尝试在更传统的嵌套 for 循环中使用 getRGB() 和 setRGB() 的单个像素版本,但这甚至更慢(尽管可能需要更少的 RAM,因为它没有 int[] )。

这就是可迭代类型解决的问题,但我找不到任何将该原则应用于图像的方法。对于这个项目,如果有效的话,我可以接受所有不是“最佳实践”的黑客攻击。

有什么方法可以迭代缓冲图像的原始数据吗?

最佳答案

最快的方法是访问 DataBuffer,因为您可以直接访问像素值,但您必须处理所有情况/类型:

public void Test(BufferedImage img)
{
switch ( img.getType() )
{
case BufferedImage.TYPE_BYTE_GRAY :
case BufferedImage.TYPE_3BYTE_BGR :
byte[] bufferbyte = ((DataBufferByte)img.getRaster().getDataBuffer()).getData() ;
//...
break ;
case BufferedImage.TYPE_USHORT_GRAY :
short[] buffershort = ((DataBuffer)img.getRaster().getDataBuffer()).getData() ;
//...
break ;
//Other cases
}
}

关于java - 有没有更快的方法来遍历java中的BufferedImage的像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632753/

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