cmyk к rgb используя php

Я использую следующий скрипт для сохранения изображений в папке, но есть одно изображение, которое показывает это сообщение "изображение не может быть отображено, поскольку оно содержит ошибки".

Я думаю, что проблема в том, что называется cmyk и rgb на изображении, но при поиске в Интернете способа конвертировать cmyk в rgb с помощью php, я не могу найти пример того, как это сделать.

Вот один из примеров: http://offshootinc.com/blog/2008/10/24/using-the-imagick-class-to-convert-a-cmyk-jpeg-to-rgb/ но я не понимаю как использовать это в моем случае.

Ссылка на изображение выглядит примерно так: www.example.com/attachment?id=2290

Сценарий выглядит следующим образом:

<?php 
$image = 'http://www.dealrush.ie/attachment?id=2290';
$name = 'somename';
$alt = 'somealt';
$saveimage = file_get_contents($image);
file_put_contents("/usr/local/pem/vhosts/155030/webspace/httpdocs/img/$name.jpg", $saveimage);?>

Позже на некоторых страницах я буду использовать что-то вроде этого, чтобы показать изображение.<code><?php echo $alt?></code>

Любая помощь с преобразованием этих изображений будет оценена Спасибо Дэниел

3 ответа

Решение

Я сомневаюсь, что цветовое пространство (CMYK или RGB) это ваша проблема. Хотя все должны использовать изображения RGB в сети, браузеры по-прежнему будут отображать изображение CMYK без жалоб.

Чтобы преобразовать изображение из CMYK в RGB, вам необходимо установить программу манипуляции воображением, такую ​​как ImageMagick, GraphicsMagick или ExactImage. Любой из них может делать то, что вы хотите, но должен быть установлен администратором сервера. Если вам повезет, ImageMagick может быть уже установлен, и в этом случае вы можете сделать это:

$image= '/path/to/your/file.jpg';
$i = new Imagick($image);
$i->setImageColorspace(Imagick::COLORSPACE_SRGB);
$i->writeImage($image);
$i->destroy();

Обратите внимание, что ImageMagick является самым мощным, ExactImage является самым быстрым, а GraphicsMagick является народом ImageMagick, который быстрее, но немного менее мощный и имеет некоторые ошибки. Из PHP можно использовать только ImageMagick, остальные должны выполняться с exec функция, хотя это не обязательно плохо, поскольку они, вероятно, обрабатывают свою собственную память и очищают ее намного лучше, чем PHP.

CMYK - это метод печати изображений с использованием субтрактивного смешивания света, а не добавки. Как вы, вероятно, знаете, цвета RGB состоят из красного, зеленого и синего, и пиксели на мониторе компьютера или телевизоре излучают эти цвета. В печати обычно используется белая бумага. Он отражает (близко к) 100% красного, зеленого и синего света. Когда вы наносите чернила на бумагу, они поглощают один или несколько из этих цветов. Таким образом, красные чернила фактически поглощают зеленый и синий свет, который обычно отражается от бумаги. В печати они используют дополнения красного, зеленого и синего цветов. Это голубой, пурпурный и желтый. CMY = голубой, пурпурный, желтый. К обозначает черный. (Они не использовали B, потому что синий цвет в RGB уже B.) Оказывается, трудно получить хороший глубокий черный, используя голубые, пурпурные и желтые чернила (плюс дорого - вы должны использовать все 3!), поэтому они добавляют немного чистого черного (который почти не отражает), чтобы он выглядел лучше.

Так что это значит для вас, что вы должны конвертировать из CMYK в RGB. К сожалению, нет единого способа сделать это. Если вы посмотрите на что-то похожее на Photoshop, вам потребуется сначала настроить типы чернил и бумаги, которые вы хотите эмулировать, прежде чем конвертировать.

Если бы у вас был чистый CMY без черного компонента, вы могли бы использовать r = 1,0 - c, g = 1,0 - m, b = 1,0 - y и получить достаточно хорошее приближение изображения. Первый ответ на этот вопрос - разумный ответ.

Вы также можете определить конкретное преобразование, которое вы хотите использовать в Photoshop или каком-либо другом приложении, и составить таблицу из этого. Я делал это раньше, создавая изображение, скажем, 1024x1024. Каждый квадрат 32x32 имеет градиент с голубым в направлении x, идущим от 0 до 1, и пурпурным в направлении y, идущим от 0 до 1. Затем слева направо каждый квадрат имеет увеличивающееся количество желтого цвета и идет сверху вниз, в них растет количество черного. Я загружаю изображение в Photoshop, преобразую его в RGB и сохраняю снова в формате без потерь (например, TIFF) без листов, полос или слоев (для простоты использования). Затем я загружаю его в свое приложение и использую его в качестве справочной таблицы для того же преобразования в RGB. В первый раз это немного громоздко, но как только вы создали таблицу преобразования, ее довольно легко использовать. Я просто использую билинейную интерполяцию для генерации значения RGB.

Решение ImageMagick:

Это инвертирует ваше изображение:

      $img->setImageColorspace(imagick::COLORSPACE_RGB);

Согласно https://www.php.net/manual/de/imagick.setimagecolorspace.php#107716
(с небольшими корректировками (профиль CMYK))

      if ($img->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
   $profiles = $img->getImageProfiles('*', false);
   // we're only interested if ICC profile(s) exist
   $has_icc_profile = (array_search('icc', $profiles) !== false);
   // if it doesnt have a CMYK ICC profile, we add one
   if ($has_icc_profile === false) {
       $icc_cmyk = file_get_contents(dirname(__FILE__).'/PSOuncoated_v3_FOGRA52.icc');
       $img->profileImage('icc', $icc_cmyk);
       unset($icc_cmyk);
   }
   // then we add an RGB profile
   $icc_rgb = file_get_contents(dirname(__FILE__).'/sRGB_v4_ICC_preference.icc');
   $img->profileImage('icc', $icc_rgb);
   unset($icc_rgb);
}

$img->stripImage (); // this will drop down the size of the image dramatically (removes all profiles)

// Don't forget to save the file
$img->writeImage($file);

Здесь вы найдете профили ICC:

sRGB: https://www.color.org/sRGB_v4_ICC_preference.icc
CMYK: https://www.color.org/registry/profiles/PSOuncoated_v3_FOGRA52.icc

Другие вопросы по тегам