2015-03-09 2 views
1
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)Как установить пиксель XYZ-ColorSpace в BufferedImage?

+1

Что вы пытаетесь сделать именно? – immibis

+0

Да, у меня есть задача: конвертировать изображение из цветового пространства RGB в другое цветовое пространство (например, к XYZ). Использование формул – Dmitry

+0

Насколько я знаю, BufferedImage хранит изображения в RGB. если бы был setXYZ, все, что он сделал бы, это преобразовать обратно в RGB, а затем сохранить RGB. – immibis

ответ

1

Для работы с BufferedImage в другой цветовой модели RGB, чем вы обычно должны работать с Raster или DataBuffer непосредственно.

Самый быстрый способ конвертировать из цветового пространства 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(); 
Смежные вопросы