{"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.org.es\/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":"","_es_post_content":"<!-- wp:paragraph -->\n<p>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<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>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<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>En mi caso la imagen de origen tiene perfil&nbsp;<a href=\"https:\/\/www.wan-ifra.org\/de\/articles\/2015\/09\/30\/newspaper-colour-profile-download\" target=\"_blank\" rel=\"noopener noreferrer\">WAN-IFRAnewspaper26v5<\/a> (sucesor del <a href=\"https:\/\/www.ifra.com\/WebSite\/ifra.nsf\/html\/CONT_ISO_DOWNLOADS\" target=\"_blank\" rel=\"noopener noreferrer\">ISOnewspaper26v4<\/a>) y para su correcta visualizaci\u00f3n en un visor sin gesti\u00f3n de color hay que convertirla al&nbsp;perfil <a href=\"https:\/\/www.color.org\/srgbprofiles.xalter\" target=\"_blank\" rel=\"noopener noreferrer\">sRGB<\/a> ya que la gama de colores (aka <a href=\"https:\/\/es.wikipedia.org\/wiki\/Gama_de_color\" target=\"_blank\" rel=\"noopener noreferrer\">gamut<\/a>) del WAN-IFRA caben por completo en la gama del sRGB, como se puede comprobar mediante la fabulosa herramienta <a href=\"https:\/\/www.iccview.de\/index.php\/3d\" target=\"_blank\" rel=\"noopener noreferrer\">ICCView<\/a>:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"align\":\"center\",\"id\":226} -->\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg\" rel=\"https:\/\/www.iccview.de\/index.php\/3d noopener\"><img src=\"\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB-300x219.jpg\" alt=\"WAN-IFRAnewspaper26v5 vs sRGB (https:\/\/www.iccview.de\/index.php\/3d)\" class=\"wp-image-226\"\/><\/a><figcaption>WAN-IFRAnewspaper26v5 vs sRGB (https:\/\/www.iccview.de\/index.php\/3d)<\/figcaption><\/figure><\/div>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>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<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Y es cierto, si en Photoshop (y aqu\u00ed no vale <a href=\"https:\/\/www.gimp.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Gimp<\/a> porque <a href=\"https:\/\/wiki.archlinux.org\/index.php\/GIMP\/CMYK_support\" target=\"_blank\" rel=\"noopener noreferrer\">no puede editar im\u00e1genes CMYK<\/a>) abrimos nuestra imagen, asignamos el perfil WAN-IFRA, convertimos al sRGB <strong>compensando el punto negro, con <a href=\"https:\/\/www.gusgsm.com\/07_cuatro_propositos_conversion\" target=\"_blank\" rel=\"noopener noreferrer\">prop\u00f3sito colorim\u00e9trico relativo<\/a><\/strong>&nbsp;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<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>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 <a href=\"https:\/\/www.imagemagick.org\/script\/index.php\" target=\"_blank\" rel=\"noopener noreferrer\">ImageMagick<\/a>.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>ImageMagick es una de esas piezas de c\u00f3digo libre (<a href=\"https:\/\/www.imagemagick.org\/script\/license.php\" target=\"_blank\" rel=\"noopener noreferrer\">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 (<a href=\"https:\/\/php.net\" target=\"_blank\" rel=\"noopener noreferrer\">PHP<\/a>, <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Python<\/a>...) como en aplicaciones de diverso tipo (C++, .NET...).<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>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<!-- \/wp:paragraph -->\n\n<!-- wp:enlighter\/codeblock {\"language\":\"shell\",\"theme\":\"dracula\"} -->\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">convert -black-point-compensation -intent Relative ImageCMYK.tif -profile ISOnewspaper26v4.icc -profile sRGB.icc ImageRGB.png<\/pre>\n<!-- \/wp:enlighter\/codeblock -->\n\n<!-- wp:paragraph -->\n<p>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<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Y llega la hora del PHP, utilizando la librer\u00eda <a href=\"https:\/\/pecl.php.net\" target=\"_blank\" rel=\"noopener noreferrer\">PECL<\/a> para ImageMagick (<a href=\"https:\/\/php.net\/manual\/es\/book.imagick.php\" target=\"_blank\" rel=\"noopener noreferrer\">IMagick<\/a>):<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:enlighter\/codeblock {\"language\":\"php\",\"theme\":\"dracula\"} -->\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$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<!-- \/wp:enlighter\/codeblock -->\n\n<!-- wp:paragraph -->\n<p>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 <strong>compensar el punto negro<\/strong>, <a href=\"https:\/\/www.gusgsm.com\/search\/node\/punto%20negro\" target=\"_blank\" rel=\"noopener noreferrer\">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 <em>setOption<\/em> para habilitar la compensaci\u00f3n del punto negro, el <a href=\"https:\/\/github.com\/mkoppanen\/imagick\/issues\/83\" target=\"_blank\" rel=\"noopener noreferrer\">IMagick no lo soporta<\/a> (a\u00fan).<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>As\u00ed que hay que buscar otra manera, y yo he probado los objetos <a href=\"https:\/\/es.wikipedia.org\/wiki\/Component_Object_Model\" target=\"_blank\" rel=\"noopener noreferrer\">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 <a href=\"https:\/\/php.net\/manual\/es\/book.com.php\" target=\"_blank\" rel=\"noopener noreferrer\">utilizar COM con PHP<\/a> hay que <a href=\"https:\/\/php.net\/manual\/es\/com.installation.php\" target=\"_blank\" rel=\"noopener noreferrer\">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<!-- \/wp:paragraph -->\n\n<!-- wp:enlighter\/codeblock {\"language\":\"php\",\"theme\":\"dracula\"} -->\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$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<!-- \/wp:enlighter\/codeblock -->\n\n<!-- wp:paragraph -->\n<p>Obviando que he habilitado un array para contener tantos ficheros a tratar como deseemos, hay varias consideraciones a tener en cuenta:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul><li>Los par\u00e1metros que espera el m\u00e9todo <em>Convert<\/em> son: <ol><li>Fichero de entrada<\/li><li>Par\u00e1metros de conversi\u00f3n (primero el par\u00e1metro y luego el valor si tuviera)<\/li><li>Fichero de salida <\/li><\/ol><\/li><li>En script para l\u00ednea de comando las rutas pueden ser relativas, para web es preferible rutas absolutas en todos los ficheros.<\/li><li>Hay que evaluar como <em>string<\/em> todas las variables que utilicemos como par\u00e1metro del m\u00e9todo <em>Convert<\/em>.<\/li><li>Hay que terminar el script destruyendo el objeto COM que hemos creado al inicio, especialmente en entorno web:  <code data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">$MagickImage = null;<\/code><\/li><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>Y ya est\u00e1, no hemos acabado la guerra a\u00fan, pero ha sido una batalla importante la de hoy.<\/p>\n<!-- \/wp:paragraph -->","_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.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB-150x150.jpg",150,150,true],"ninja_gutenberg_blocks_landscape_large":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_portrait_large":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_square_large":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_landscape":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_portrait":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"ninja_gutenberg_blocks_square":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false],"full":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/05\/WAN-IFRAnewspaper26v5-vs-sRGB.jpg",396,289,false]},"_links":{"self":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/posts\/225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/comments?post=225"}],"version-history":[{"count":17,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/posts\/225\/revisions"}],"predecessor-version":[{"id":1865,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/posts\/225\/revisions\/1865"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/media\/226"}],"wp:attachment":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/media?parent=225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/categories?post=225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/tags?post=225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}