Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация CMYK изображений в RGB 
:(
    Опции темы
xul
Дата 16.11.2011, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



Добрый день.

При чтение 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);
  конвертацию смик растра в ргб растр. ну т.е. он его конвертирует но профайл, который я передаю вообще никак не учитывается. 
т.е. всегда получается что-то вроде

до 
user posted image
после
user posted image

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

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

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



PM MAIL   Вверх
firedrago
Дата 16.11.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 22.9.2005

Репутация: 2
Всего: 3



как по мне,  то на яве обрабатывать картинки - это изврат.... благо для всех платформ есть  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);
        }
}


Это сообщение отредактировал(а) firedrago - 16.11.2011, 14:41
PM MAIL   Вверх
xul
Дата 16.11.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



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

К сожалению специфика проекта не позволяет использовать внешние программы или по возможности обходимся даже без JAI
PM MAIL   Вверх
firedrago
Дата 17.11.2011, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 22.9.2005

Репутация: 2
Всего: 3



вот похоже на то что Вам надо
Код

    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;
    }


Это сообщение отредактировал(а) firedrago - 17.11.2011, 10:43
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.