【问题标题】:How to set XYZ-ColorSpace pixel in BufferedImage?如何在 BufferedImage 中设置 XYZ-ColorSpace 像素?
【发布时间】:2015-03-09 06:43:40
【问题描述】:
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)

【问题讨论】:

  • 你到底想做什么?
  • 是的,我有任务:将图像从 RGB 颜色空间转换为另一个颜色空间(例如转换为 XYZ)。使用公式
  • 据我所知,BufferedImage 以 RGB 格式存储图像。如果有一个 setXYZ,它所要做的就是转换回 RGB,然后存储 RGB。
  • 谢谢,也许可以用不同的方法来存储图像,可以设置色彩空间设置吗?
  • 我想我找到了出路:我创建了新的 Color(ColorSpace cspace, float[] components, float alpha) 和 Graphics g。并像单点线一样绘制像素

标签: java set rgb bufferedimage


【解决方案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);

然后您可以通过WritableRaster 修改样本/像素,使用raster.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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2014-06-07
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多