Java JH实验室量化使用以减少图像颜色深度
我正在尝试使用QuantizeFilter 减少屏幕快照的颜色深度 下面是我非常简单的代码:Java JH实验室量化使用以减少图像颜色深度,java,image,image-processing,quantization,Java,Image,Image Processing,Quantization,我正在尝试使用QuantizeFilter 减少屏幕快照的颜色深度 下面是我非常简单的代码: Robot robo = new Robot(); BufferedImage notQuantized = robo.createScreenCapture( new Rectangle ( 0, 0, 300, 300 ) ); BufferedImage Quantized = new BufferedImage( 300, 300, BufferedImage.TYPE
Robot robo = new Robot();
BufferedImage notQuantized = robo.createScreenCapture( new Rectangle ( 0, 0, 300, 300 ) );
BufferedImage Quantized = new BufferedImage( 300, 300, BufferedImage.TYPE_INT_BGR);
File nonquantized = new File ("C:\\nonquantized.png");
File quantized = new File("C:\\quantized.png");
nonquantized.createNewFile();
quantized.createNewFile();
QuantizeFilter bla = new QuantizeFilter();
int [] outPixels = new int[300*300*3];
int [] inPixels = new int[300*300*3];
notQuantized.getRaster().getPixels( 0, 0, 300, 300, inPixels );
bla.quantize( inPixels, outPixels, 300, 300,2, true, true );
Quantized.getRaster().setPixels( 0, 0, 300, 300, outPixels );
ImageIO.write( Quantized, "png", quantized );
ImageIO.write( notQuantized, "png", nonquantized );
然而,留给我的是:
原始img:
量化img:
对该问题的进一步分析表明,inPixels阵列填充错误;它用原始图像的上三分之一填充三次
有人告诉我怎么解决吗
另外,Java中有没有好的+快速量化算法?我搜索的是一种算法,它将获取一张类型为INT的BGR图像,并生成一张新的类型为INT的BGR图像,但实际像素差异较小,因此可以轻松缩小
例如,如果原始图像中有两个像素,其值为255、255、234,另一个像素的值为255、255、236,则它们都应转换为255255240。干杯以下示例将正确转换您的图像:
QuantizeFilter q = new QuantizeFilter();
int [] inPixels = new int[image.getWidth()*image.getHeight()*3];
int [] outPixels = new int[image.getWidth()*image.getHeight()*3];
image.getRaster().getPixels( 0, 0, image.getWidth(), image.getHeight(), inPixels );
q.quantize(inPixels, outPixels, image.getWidth(), image.getHeight(), 64, false, false);
WritableRaster raster = (WritableRaster) image.getData();
raster.setPixels(0,0,width,height,outPixels);
此外,没有理由隐式创建文件,因为ImageIO.write会自动创建文件。我也遇到了同样的问题,问题出在你发布的代码上,而不是你发布的代码。
QuantizeFilter
类没有遍历所有像素。您需要找到这个代码部分
if (!dither) {
for (int i = 0; i < count; i++)
outPixels[i] = table[quantizer.getIndexForColor(inPixels[i])];
if(!抖动){
for(int i=0;i
然后用计数乘以3
请注意,如果最后两个参数设置为false,则这只是一个修复