{"id":225,"date":"2016-05-22T01:06:07","date_gmt":"2016-05-21T23:06:07","guid":{"rendered":"http:\/\/lab.fawno.com\/?p=225"},"modified":"2022-03-07T01:44:44","modified_gmt":"2022-03-07T00:44:44","slug":"","status":"publish","type":"post","link":"https:\/\/lab.fawno.com\/en\/2016\/05\/22\/php-e-imagemagick-conversion-de-imagenes-cmyk-a-rgb\/","title":{"rendered":"","raw":""},"content":{"rendered":"","protected":false,"raw":""},"excerpt":{"rendered":"","protected":false,"raw":""},"author":1,"featured_media":226,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_typography_data":[],"_editorskit_blocks_typography":"","_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_es_post_content":"\n

Seg\u00fan la teor\u00eda se puede visualizar correctamente una imagen CMYK siempre y cuando tenga informaci\u00f3n sobre el perfil de color... en teor\u00eda.<\/p>\n\n\n\n

En la pr\u00e1ctica puedes tener las im\u00e1genes (TIFF en mi caso) sin ning\u00fan tipo de informaci\u00f3n sobre el perfil de color por motivos pr\u00e1cticos. Adem\u00e1s puede que tambi\u00e9n concurran limitaciones con el software de visualizaci\u00f3n.<\/p>\n\n\n\n

En mi caso la imagen de origen tiene perfil WAN-IFRAnewspaper26v5<\/a> (sucesor del ISOnewspaper26v4<\/a>) y para su correcta visualizaci\u00f3n en un visor sin gesti\u00f3n de color hay que convertirla al perfil sRGB<\/a> ya que la gama de colores (aka gamut<\/a>) del WAN-IFRA caben por completo en la gama del sRGB, como se puede comprobar mediante la fabulosa herramienta ICCView<\/a>:<\/p>\n\n\n\n

\"WAN-IFRAnewspaper26v5<\/a>
WAN-IFRAnewspaper26v5 vs sRGB (http:\/\/www.iccview.de\/index.php\/3d)<\/figcaption><\/figure><\/div>\n\n\n\n

As\u00ed que ya tenemos una soluci\u00f3n al problema \u00bfC\u00f3mo visualizar con suficiente precisi\u00f3n una imagen CMYK en un visor sin gesti\u00f3n de color?: convirtiendo la imagen al perfil sRGB.<\/p>\n\n\n\n

Y es cierto, si en Photoshop (y aqu\u00ed no vale Gimp<\/a> porque no puede editar im\u00e1genes CMYK<\/a>) abrimos nuestra imagen, asignamos el perfil WAN-IFRA, convertimos al sRGB compensando el punto negro, con prop\u00f3sito colorim\u00e9trico relativo<\/a><\/strong> y guardamos. Veremos como ahora tenemos una imagen en RGB con los colores casi id\u00e9nticos al original CMYK. Esta es, digamos, la demostraci\u00f3n pr\u00e1ctica de nuestra soluci\u00f3n.<\/p>\n\n\n\n

Ahora que ya sabemos lo que hay que hacer y hemos hecho una prueba de concepto, toca automatizar la tarea, para lo cual nos apoyaremos en ImageMagick<\/a>.<\/p>\n\n\n\n

ImageMagick es una de esas piezas de c\u00f3digo libre (licencia Apache<\/a>) que suponen una aut\u00e9ntica joya. Nos pone al alcance de la mano una poderosa herramienta de manipulaci\u00f3n de im\u00e1genes para su uso tanto de manera manual como para su integraci\u00f3n tanto en scripts (PHP<\/a>, Python<\/a>...) como en aplicaciones de diverso tipo (C++, .NET...).<\/p>\n\n\n\n

En este caso tambi\u00e9n hay que hacer una prueba de concepto, para ello se busca un poco por ah\u00ed y se da con la linea de comando correcta:<\/p>\n\n\n\n

convert -black-point-compensation -intent Relative ImageCMYK.tif -profile ISOnewspaper26v4.icc -profile sRGB.icc ImageRGB.png<\/pre>\n\n\n\n

Es f\u00e1cil comprobar como apenas hay diferencias entre la imagen que hemos hecho a mano con el Photoshop con la que hemos obtenido por medio de ImageMagick: vamos por buen camino.<\/p>\n\n\n\n

Y llega la hora del PHP, utilizando la librer\u00eda PECL<\/a> para ImageMagick (IMagick<\/a>):<\/p>\n\n\n\n

$image = new Imagick('ImageCMYK.tif');\n\n$image->setImageRenderingIntent(Imagick::RENDERINGINTENT_RELATIVE);\n$image->setOption('black_point_compensation', true);\n\n$icc_cmyk = file_get_contents('ISOnewspaper26v4.icc');\n$image->profileImage('icc', $icc_cmyk);\n\n$icc_rgb = file_get_contents('sRGB Color Space Profile.icm');\n$image->profileImage('icc', $icc_rgb);\n\n$image->setImageColorSpace(Imagick::COLORSPACE_SRGB);\n\n$image->writeImage('ImageRGB.jpg');<\/pre>\n\n\n\n

Vale, el c\u00f3digo tiene poco que comentar... abrimos la imagen convertida en sRGB y vemos c\u00f3mo lo que tenemos es una imagen \"lavada\", como si le hubieran dado un velo blanco. He remarcado antes que hab\u00eda que compensar el punto negro<\/strong>, sea lo que demonios sea<\/a> (no voy a explicarlo ahora). Digamos que experimentalmente es lo que hemos comprobado que funciona. Pues bien, aunque hemos hecho un setOption<\/em> para habilitar la compensaci\u00f3n del punto negro, el IMagick no lo soporta<\/a> (a\u00fan).<\/p>\n\n\n\n

As\u00ed que hay que buscar otra manera, y yo he probado los objetos COM<\/a>. El porqu\u00e9 he elegido esta t\u00e9cnica es porque la conozco al utilizarla para controlar Acrobat y otras aplicaciones mediante PHP. Para poder utilizar COM con PHP<\/a> hay que habilitar la extensi\u00f3n php_dcom_dotnet.dll<\/a> (\u00bfno he mencionado que el entorno de este trabajo es Windows?, pues ya lo sabes). El c\u00f3digo:<\/p>\n\n\n\n

$MagickImage = new COM('ImageMagickObject.MagickImage') or die ('ImageMagickObject didn\\'t load, too bad');\n\n$cmyk = 'WAN-IFRAnewspaper26v5.icc';\n$rgb = 'sRGB Color Space Profile.icm';\n\n$files[] = ['i' => 'ImageCMYK.tif', 'o' => 'ImageRGB.png'];\nforeach ($files as $file) {\n  try {\n    $MagickImage->Convert((string) $file['i'], '-black-point-compensation', '-intent', 'Relative', '-profile', (string) $cmyk, '-profile', (string) $rgb, (string) $file['o']);\n  } catch (Exception $e) {\n    print_r($e);\n  }\n}\n$MagickImage = null;<\/pre>\n\n\n\n

Obviando que he habilitado un array para contener tantos ficheros a tratar como deseemos, hay varias consideraciones a tener en cuenta:<\/p>\n\n\n\n

  • Los par\u00e1metros que espera el m\u00e9todo Convert<\/em> son:
    1. Fichero de entrada<\/li>
    2. Par\u00e1metros de conversi\u00f3n (primero el par\u00e1metro y luego el valor si tuviera)<\/li>
    3. Fichero de salida <\/li><\/ol><\/li>
    4. En script para l\u00ednea de comando las rutas pueden ser relativas, para web es preferible rutas absolutas en todos los ficheros.<\/li>
    5. Hay que evaluar como string<\/em> todas las variables que utilicemos como par\u00e1metro del m\u00e9todo Convert<\/em>.<\/li>
    6. Hay que terminar el script destruyendo el objeto COM que hemos creado al inicio, especialmente en entorno web: $MagickImage = null;<\/code><\/li><\/ul>\n\n\n\n

      Y ya est\u00e1, no hemos acabado la guerra a\u00fan, pero ha sido una batalla importante la de hoy.<\/p>\n","_es_post_name":"php-e-imagemagick-conversion-de-imagenes-cmyk-a-rgb","_es_post_excerpt":"","_es_post_title":"PHP e ImageMagick, conversi\u00f3n de im\u00e1genes CMYK a RGB","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"en","footnotes":""},"categories":[39,5],"tags":[40,6],"class_list":["post-225","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gestion-de-color","category-php","tag-gestion-de-color","tag-php"],"ninja_gutenberg_blocks_featured_media_urls":{"thumbnail":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB-150x150.jpg",150,150,true],"ninja_gutenberg_blocks_landscape_large":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_portrait_large":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_square_large":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_landscape":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_portrait":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_square":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"full":["https:\/\/lab.fawno.com\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false]},"_links":{"self":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/comments?post=225"}],"version-history":[{"count":17,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/225\/revisions"}],"predecessor-version":[{"id":1865,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/225\/revisions\/1865"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/media\/226"}],"wp:attachment":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/media?parent=225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/categories?post=225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/tags?post=225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}