1

我必须截取桌面上某些区域的屏幕截图。我这样做是这样的:

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

但我不知道如何用它截屏。

4

1 回答 1

0

JPEG 写入器在写入文件时ImageIO不会ColorModel考​​虑,因为 JPEG 没有 alpha 通道。Alpha 通道是指定每个像素的透明度值的A部分。大多数图像客户端会假设 JPEG 没有 alpha 值,因为这是标准行为。ARGB

作者ImageIO将写入一个颜色变化的文件,就像图片中可爱的鲑鱼阴影作为背景一样。这是因为编写者在真正应该在 RBG 中写入值时会错误地写下这些值。

解决方法是使用 RBG 作为 ColorModel 将图像绘制到 BufferedImage。这是一些示例代码

// 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);
于 2013-06-07T09:05:40.360 回答