Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Конвертация CMYK изображений в RGB


Автор: xul 16.11.2011, 07:58
Добрый день.

При чтение CMYK изображений и конвертации их в RGB везде советуют использовать профайлы.

Код


Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpeg");
ImageReader reader = null;
while (readers.hasNext()){
      reader = readers.next();
      if (reader.canReadRaster()){
          break;
      }
}
// читаю поток
ImageInputStream ios = ImageIO.createImageInputStream(new FileInputStream(new File(myCMYKPic.jpg)));
reader.setInput(ios);

// читаю растер они имеет numBand = 4 
Raster srcCMYKRaster = reader.readRaster(0, null);

// беру профайл (пробовал разные) и создаю колорспейс
ICC_Profile cmykProfile = ICC_Profile.getInstance(new FileInputStream("Generic_CMYK Profile.icc"));
ColorSpace cmykCS = new ICC_ColorSpace(cmykProfile);
ColorSpace rgbCS = ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_sRGB);

ColorConvertOp cmykToRgb = new ColorConvertOp(cmykCS, rgbCS, null);
WritableRaster resultRGBRaster = cmykToRgb.filter(srcCMYKRaster, null);

int[] bits = new int[3];
for (int i = 0; i < bits.length; i++)
    bits[i] = 8;

// создаю ргб модель
ColorModel cm = new ComponentColorModel(rgbCS, bits, false, false, ColorModel.OPAQUE, resultRGBRaster.getTransferType());
// записываю растр в изобраение в ргб
BufferedImage result = new BufferedImage(cm, wr, false, null);
 
// write
ImageIo.write(result, "jpg", new File("myRGBPic.jpg"));



Проблем в том, что я ожидал от 
Код

cmykToRgb.filter(srcCMYKRaster, null);
  конвертацию смик растра в ргб растр. ну т.е. он его конвертирует но профайл, который я передаю вообще никак не учитывается. 
т.е. всегда получается что-то вроде

до 
http://s2.ipicture.ru/
после
http://s2.ipicture.ru/

Т.е. просто растр обрезается как-то, но цвета не конвертируются.

Что я делаю не так?

Благодарен любой помощи.



Автор: firedrago 16.11.2011, 14:41
как по мне,  то на яве обрабатывать картинки - это изврат.... благо для всех платформ есть  imagemagick....

Код

  convert cmyk.jpg -colorspace RGB rgb.jpg


а для красивого вызова из явы
Код

public void convert(String sourceImg, String targetImg){
        ProcessBuilder pb = new ProcessBuilder("convert", sourceImg, "-colorspace", "RGB", targetImg);
        pb.redirectErrorStream(true);
        
        StringBuffer error = new StringBuffer();
        Process p;
        try {
            p = pb.start();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            while((line=br.readLine())!=null){
                error.append(line + "\n");
            }
            retCode = p.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(error.length() > 0)
        {
            System.err.println(error);
        }
}

Автор: xul 16.11.2011, 16:31
Я с Вами полностью согласен =)
Раньш думал java может все. Теперь знаю, что ошибался.

К сожалению специфика проекта не позволяет использовать внешние программы или по возможности обходимся даже без JAI

Автор: firedrago 17.11.2011, 10:42
вот похоже на то что Вам надо
Код

    public static BufferedImage cmykRasterToSRGB(Raster raster, ICC_Profile cmykProfile) {
        int w = raster.getWidth();
        int h = raster.getHeight();

        ColorSpace cmykCS = new ICC_ColorSpace(cmykProfile);
        BufferedImage rgbImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        WritableRaster rgbRaster = rgbImage.getRaster();
        ColorSpace rgbCS = rgbImage.getColorModel().getColorSpace();
        ColorConvertOp cmykToRgb = new ColorConvertOp(cmykCS, rgbCS, null);
        cmykToRgb.filter(raster, rgbRaster);
        return rgbImage;
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)