Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 缓冲图像红色遮罩_Java - Fatal编程技术网

Java 缓冲图像红色遮罩

Java 缓冲图像红色遮罩,java,Java,我必须拍摄桌面上某个区域的截图。 我是这样做的: BufferedImage image = new Robot().createScreenCapture(area.areaRect); ImageIO.write(image, "jpg", new File(current)); //then I paint in on JPanel 保存到.jpg的每个屏幕截图如下所示: PNG和GIF不会发生这种情况 我在谷歌上搜索了这个问题,找到了一个解决方案,通过Toolkit类创建图像: Im

我必须拍摄桌面上某个区域的截图。 我是这样做的:

BufferedImage image = new Robot().createScreenCapture(area.areaRect);
ImageIO.write(image, "jpg", new File(current));
//then I paint in on JPanel
保存到.jpg的每个屏幕截图如下所示:

PNG和GIF不会发生这种情况

我在谷歌上搜索了这个问题,找到了一个解决方案,通过Toolkit类创建图像:

Image toolkitImage = Toolkit.getDefaultToolkit().createImage(imageUrl);

但是我不知道如何使用它拍摄屏幕截图。

在编写文件时,
ImageIO
中的JPEG编写器不考虑
ColorModel
,因为JPEG没有alpha通道。Alpha通道是指定每个像素透明度值的
ARGB
A
部分。因为这是标准行为

ImageIO
中的作者将编写一个颜色发生变化的文件,就像图片中可爱的鲑鱼色作为背景一样。这是因为编写器在实际应该在RBG中写入值时,会将值写错

解决方法是使用RBG作为ColorModel将图像绘制到BuffereImage。以下是一些:


它如何寻找PNG和GIF?屏幕截图到底出了什么问题?只是猜测,但我想说的是背景是可爱的鲑鱼色而不是白色。PNG和GIF都不错,没有问题。jpg像这样是红色的我猜CreateScreateScreenCapture制作了一个ARBG图像,并直接保存到jpg,而不指定颜色类型,这将导致像图中所示的那样的时髦颜色。这是一个JPEG编写器如何解释图像的alpha值的错误。尝试使用支持alpha透明度的格式,或者在保存之前将图像绘制为非透明缓冲图像。。。
// argbBuffer is the ARGB Image that should be written as JPEG:
WritableRaster raster = argbBuffer.getRaster();
WritableRaster newRaster = raster.createWritableChild(0, 0, width, height, 0, 0, new int[] {0, 1, 2});

// create a ColorModel that represents the one of the ARGB except the alpha channel:
DirectColorModel cm = (DirectColorModel)argbBuffer.getColorModel();
DirectColorModel newCM = new DirectColorModel(cm.getPixelSize(),
cm.getRedMask(), cm.getGreenMask(), cm.getBlueMask());

// now create the new buffer that is used ot write the image:
BufferedImage rgbBuffer = new BufferedImage(newCM, newRaster, false, null);