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

标签 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)

最佳答案

要在与 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);

然后,您可以使用 raster.setPixel(x, y, PixelData)raster.setPixels(x, y, w, h, PixelData)raster.setSample(x, y, band, ...)/setSamples(x, y, w, h, band, ...) 方法之一,通过 WritableRaster 修改样本/像素。

您还可以使用raster.getDataBuffer()获取DataBuffer,或者如果您确实愿意,可以直接访问后备数组:

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

关于java - 如何在 BufferedImage 中设置 XYZ-ColorSpace 像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28936452/

相关文章:

java - 在 log4j 中,在记录之前检查 isDebugEnabled 是否会提高性能?

java - 在Java中用Set中的另一个元素替换现有元素

c++ - std::set 与用户定义的类型,如何确保没有重复

jquery # 颜色转rgba?

java - 运行tomcat时Manifest主要属性的签名文件摘要无效

java - GSON & Volley => 预期为 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT

php - RGBA格式HEX转RGB格式HEX? PHP

python - 使用python中的rawpy模块将原始图像转换为tiff

java - 如何以数组形式检索 JTable 数据

时间:2019-03-17 标签:c++: how can i overload < operator correctly?