簡體   English   中英

使用 PHP 和 Imagick 將 CMYK PDF 轉換為 SRGB JPG

[英]Convert CMYK PDF to SRGB JPG using PHP and Imagick

我正在嘗試使用 Imagick 和 PHP 將 PDF 文檔的第一頁轉換為 JPEG。 只要 PDF 的色彩空間是 SRGB,轉換就會成功並且生成的圖像具有正確的顏色。 但是,如果 PDF 具有 CMYK 色彩空間,則轉換后圖像顏色會關閉(更亮或更暗)。

我目前正在使用以下軟件:

  • PHP 7.4.3
  • ImageMagick 6.9.10-23 Q16 x86_64 20190101(deb 包)
  • Ghostscript 9.50 (2019-10-15)

我正在 Windows 10 上開發 WSL2。

我的測試 PDF 可以在這里找到。

因為我對結果轉換不滿意,所以我首先嘗試查看是否可以使用 Imagick cli 進行成功轉換。 經過大量的反復試驗,我發現以下命令產生了最好的結果:

convert -density 300 -colorspace srgb input.pdf[0] -layers flatten -strip output.jpg

結果:

在此處輸入圖片說明

然后我將命令重寫為 PHP:

$input = 'input.pdf';
$output = 'output.pdf';
$image = new Imagick();
$image->setResolution(300, 300);
$image->readImage("{$input}[0]");
$image->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$image = $image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->setImageFormat('jpeg');
$image->stripImage();
$image->writeImage($output);
$image->destroy();

結果:

在此處輸入圖片說明

PHP 代碼的結果與 CLI 版本和原始 PDF 的結果不一樣。 結果與我按照 CLI 命令運行 te 一樣:

convert -density 300 input.pdf[0] -colorspace srgb -layers flatten -strip output.jpg

該命令看起來幾乎相同,但是顏色空間的轉換發生在稍后。

我的問題是:我在 PHP 代碼中遺漏了什么步驟來實現與命令相同的結果

convert -density 300 -colorspace srgb input.pdf[0] -layers flatten -strip output.jpg

附加信息:我還嘗試使用顏色配置文件進行色彩空間轉換。 代替

$image->transformImageColorspace(Imagick::COLORSPACE_SRGB);

我用了

$cmyk = file_get_contents('USWebCoatedSWOP.icc');
$rgb = file_get_contents('sRGB_v4_ICC_preference.icc');
$image->profileImage('icc', $cmyk);
$image->profileImage('icc', $rgb);

除了這兩個配置文件,我還嘗試了其他 CMYK(CoatedFOGRA39、JapanColor2001Coated...)和 SRGB(AdobeRGB1998、AppleRGB、sRGB_v4_ICC_preference_displayclass...)配置文件的組合。

但是,我找不到接近 CLI 輸出結果和原始 PDF 文件的配置文件組合。

感謝@fmw42,我能夠解決我的問題。 要修復它,請在閱讀 pdf 之前使用setColorSpace()設置色彩空間。

$input = 'input.pdf';
$output = 'output.pdf';

$image = new Imagick();

$image->setResolution(300, 300);
$image->setColorSpace(Imagick::COLORSPACE_SRGB); // Add this line

$image->readImage("{$input}[0]");

// $image->transformImageColorspace(Imagick::COLORSPACE_SRGB); // You don't need this line
$image = $image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

$image->setImageFormat('jpeg');
$image->stripImage();
$image->writeImage($output);

$image->destroy();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM