如何在BufferedImage中设置XYZ-ColorSpace像素?

时间:2015-03-09 06:43:40

标签: java set rgb bufferedimage

private BufferedImage outputImg;

for(int y = 0; y < inputImg.getHeight(); ++y)
{
    for(int x = 0; x < inputImg.getWidth(); ++x)
    {
        Color originPixel = new Color(inputImg.getRGB(x, y));
        double X = 0.412453 * originPixel.getRed() + 0.35758 * originPixel.getGreen() + 0.180423 * originPixel.getBlue();
        double Y = 0.212671 * originPixel.getRed() + 0.71516 * originPixel.getGreen() + 0.072169 * originPixel.getBlue();
        double Z = 0.019334 * originPixel.getRed() + 0.119193 * originPixel.getGreen() + 0.950227 * originPixel.getBlue();
        //???
    }
}

在色彩空间转换功能中,我得到RGB像素并将其转换为XYZ像素。但是如何在outputImg中设置此结果? 在BufferedImage种方法中,我只看到setRGB(int r, int g, int b)

1 个答案:

答案 0 :(得分:1)

要使用与RGB不同的颜色模型中的BufferedImage,您通常必须直接使用RasterDataBuffer

从RGB色彩空间(如sRGB)转换为XYZ色彩空间(如CIEXYZ)的最快方法是使用ColorConvertOp。但是,我认为这是一项任务,您的任务是自己实现。

可以像这样创建一个XYZ BufferedImage

int w = 1024, h = 1024; // or whatever you prefer

ColorSpace xyzCS = ColorSpace.getInstance(ColorSpace.CS_CIEXYZ);
ComponentColorModel cm = new ComponentColorModel(xyzCS, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
WritableRaster raster = cm.createCompatibleWritableRaster(w, h);
BufferedImage xyzImage = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);

然后,您可以使用WritableRasterraster.setPixel(x, y, pixelData)或其中一种raster.setPixels(x, y, w, h, pixelData)方法,通过raster.setSample(x, y, band, ...)/setSamples(x, y, w, h, band, ...)修改样本/像素。

您也可以使用DataBuffer获取raster.getDataBuffer(),或者如果您愿意,可以直接访问支持数组:

// The cast is safe, as long as you used DataBuffer.TYPE_BYTE for cm above
DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();
byte[] pixels = buffer.getData();