Imagick verschil command line / php

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • juiced01
  • Registratie: December 2009
  • Laatst online: 09:38
Ik wil in een PHP web applicatie (op basis van Zend Framework 2) een PDF bestand (in CMYK) omzetten naar een JPG bestand, in RGB om een preview van het bestand te genereren.

Ik heb het geprobeerd via de command line, en dit werkt perfect:
code:
1
convert data/test_data/Folder.pdf -profile data/icc/cmyk/USWebCoatedSWOP.icc -profile data/icc/rgb/AdobeRGB1998.icc output.jpg


Nu wil ik dit gaan uitvoeren in mijn applicatie. Om te beginnen heb ik het zelfde commando nog eens uitgevoerd via exec, dit werkt - zoals je verwacht - ook prima.
PHP: filename
1
2
3
4
$fileToConvert = 'data/test_data/Folder.pdf';
$inputIccProfile = 'data/icc/cmyk/USWebCoatedSWOP.icc';
$outputIccProfile = 'data/icc/rgb/AdobeRGB1998.icc';
$destenationFileName = 'data/output.jpg';

PHP: filename
1
2
$strCommand = sprintf("convert %s -profile %s -profile %s %s", $fileToConvert, $inputIccProfile, $outputIccProfile, $destenationFileName);
exec($strCommand);


Maar, ik wil graag de PHP Imagick package gebruiken. Ik heb de volgende test case gemaakt:

PHP: filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$im = new \Imagick($fileToConvert);
if ($im->getImageColorspace() == \Imagick::COLORSPACE_CMYK) {
    $profiles = $im->getImageProfiles('*', false);

    $hasIccProfile = (array_search('icc', $profiles) !== false);
    if (!$hasIccProfile) {
        $iccCmyk = file_get_contents($inputIccProfile);
        $im->profileImage('icc', $iccCmyk);
    }
}

if ($im->getImageColorspace() != \IMagick::COLORSPACE_RGB && $im->getImageColorspace() != \IMagick::COLORSPACE_GRAY) {
    $iccRgb = file_get_contents($outputIccProfile);
    $im->profileImage('icc', $iccRgb);
    $im->setImageColorspace(\Imagick::COLORSPACE_RGB);
}
$im->writeImages($destenationFileName, false);


Maar, het verschilt met de command line actie!

Zien jullie wat ik vergeet of verkeerd doe?

Hieronder een afbeelding met het verschil.
Afbeeldingslocatie: http://f.cl.ly/items/0z0a3i2f0O0e2P0H1z0d/difference-in-color.jpg
Bovenste kleuren zijn correct, zowel in de PDF als in de gegenereerde JPEG dezelfde kleuren. Gegenereerd via de command line actie. De onderste kleuren zijn gegenereerd via PHP.

Systeem informatie:
OS: Ubuntu 14.04
PHP Version 5.5.9 (cli & apache2)
ImageMagick 6.9.1-2 (apache2)
ImageMagick 6.7.7-10 (cli)

Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Ik ben geen PHP expert maar volgens mij stelt setImageColorspace alleen een interne property in en moet je transformImageColorspace gebruiken om de pixels te converteren.

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • juiced01
  • Registratie: December 2009
  • Laatst online: 09:38
Voor de zekerheid heb ik de PHP module opnieuw geinstalleerd, deze is nu op zowel cli als apache versie 6.9.1-2.
eek schreef op zondag 03 mei 2015 @ 18:46:
Ik ben geen PHP expert maar volgens mij stelt setImageColorspace alleen een interne property in en moet je transformImageColorspace gebruiken om de pixels te converteren.
Ok, thanks! Aangepast, maar geen verschil in resultaat.
PHP: filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$fileToConvert = 'data/test_data/Folder.pdf';
$inputIccProfile = 'data/icc/cmyk/USWebCoatedSWOP.icc';
$outputIccProfile = 'data/icc/rgb/sRGBColorSpaceProfile.icm';
$destenationFileName = 'data/output.jpg';

$im = new \Imagick($fileToConvert);

$profiles = $im->getImageProfiles('*', false); // get profiles 
if ($im->getImageColorspace() == \Imagick::COLORSPACE_CMYK) {
    $profiles = $im->getImageProfiles('*', false);

    $hasIccProfile = (array_search('icc', $profiles) !== false);
    if (!$hasIccProfile) {
        $iccCmyk = file_get_contents($inputIccProfile);
        $im->profileImage('icc', $iccCmyk);
    }

}

if ($im->getImageColorspace() != \IMagick::COLORSPACE_SRGB && $im->getImageColorspace() != \IMagick::COLORSPACE_GRAY) {
    $iccRgb = file_get_contents($outputIccProfile);
    $im->profileImage('icc', $iccRgb);
    $im->transformimagecolorspace(\Imagick::COLORSPACE_SRGB);
    //$im->setImageColorspace(\Imagick::COLORSPACE_SRGB);
}

$im->writeImages($destenationFileName, false);
$im->destroy();


Als ik het commando om de PDF te converteren uitvoer op command line, en dan de het gegenereerde jpg bestand identity middels
code:
1
identify -verbose data/output-0.jpg

Krijg ik netjes
code:
1
Colorspace: sRGB


Als ik nu mijn PHP script run, en opnieuw identify run, krijg ik CYMK als color space!
code:
1
Colorspace: CMYK


Als ik echter boven de regel writeImages het commando
PHP: filename
1
var_dump($im->getImageColorspace());

uitvoer, krijg ik netjes 13 terug. 13 is de interne constante \Imagick::COLORSPACE_SRGB.