Php 为什么Imagick可以';导入我的psd文件时是否出现异常?

Php 为什么Imagick可以';导入我的psd文件时是否出现异常?,php,imagemagick,photoshop,imagick,Php,Imagemagick,Photoshop,Imagick,我创建了一个名为convertImage()的方法,它使用Imagick将任何文件转换为jpeg文件 我添加了ICC配置文件来处理CMYK到RGB转换 除了少数PSD文件外,这对数千个文件都很有效 public static function convertImage($localPath, $destination, $max_width, $max_height) { $image = new Imagick(); $image->readImage($localPat

我创建了一个名为
convertImage()
的方法,它使用
Imagick
将任何文件转换为
jpeg
文件

我添加了
ICC
配置文件来处理
CMYK
RGB
转换

除了少数
PSD
文件外,这对数千个文件都很有效

public static function convertImage($localPath, $destination, $max_width, $max_height)
{
    $image = new Imagick();
    $image->readImage($localPath);

    if(pathinfo($localPath, PATHINFO_EXTENSION) === "psd"){
        $image->setIteratorIndex(0);
    }

    if ($image->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
        $profiles = $image->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(__DIR__ . '/../icc/USWebUncoated.icc');
            $image->profileImage('icc', $icc_cmyk);
            unset($icc_cmyk);
        }
        // then we add an RGB profile
        $icc_rgb = file_get_contents(__DIR__ . '/../icc/sRGB_v4_ICC_preference.icc');
        $image->profileImage('icc', $icc_rgb);
        unset($icc_rgb);
    }
    $image->stripImage();
    $image->setImageFormat('jpg');
    $image->setImageCompressionQuality(85);
    $image->writeImage($destination);
    $image->clear();
    $image->destroy();

    // we resize files in a second time because of a imagick bug (pictures become black)
    $image = new Imagick();
    $image->readImage($destination);
    $image->scaleImage($max_width, $max_height, true);
    $image->writeImage($destination);
    $image->clear();
    $image->destroy();
}
对于一些
PSD
文件,我得到了以下例外:

maximum channels exceeded `ART00060111_B.psd' @ error/psd.c/ReadPSDImage/1085
对于其他人:

Unable to read the file: ART00060111_A.psd
您可以在此处找到这些文件:

这是我关于Imagick的
phpinfo()


这可能会帮助您:

这通过将最小值和最大值缩放到整个量程范围来调整特定图像通道的级别

示例#1 Imagick::autoLevelImage()


这可能会帮助您:

这通过将最小值和最大值缩放到整个量程范围来调整特定图像通道的级别

示例#1 Imagick::autoLevelImage()


以下命令对我来说在ImageMagick 6.9.9.0 Q16 Mac OSX上运行良好。正如我在前面的评论中提到的,只需转换PSD文件的第一层。对不起,我不太了解Imagick。这里是等效的ImageMagick命令

convert ART00060111_A.psd[0] -profile USWebUncoated.icc -profile sRGB_v4_ICC_preference.icc ART00060111_A.jpg

另外,看起来您正试图通过$image->setIteratorIndex(0);,访问第一层;。所以我不知道你为什么会收到这样的信息。你能在终端窗口中尝试我的命令吗?他们在那里工作吗?如果没有,那么您的ImageMagick版本中可能有一个bug

另外,为什么要通过$image->stripImage();;删除配置文件中的jpg;。为了获得最佳的跨平台和各种浏览器查看效果,如果不使用sRGB配置文件,您可以获得更一致的外观效果


您提到的哪个bug导致您必须重新启动Imagick来调整大小?

以下命令在ImageMagick 6.9.9.0 Q16 Mac OSX上运行良好。正如我在前面的评论中提到的,只需转换PSD文件的第一层。对不起,我不太了解Imagick。这里是等效的ImageMagick命令

convert ART00060111_A.psd[0] -profile USWebUncoated.icc -profile sRGB_v4_ICC_preference.icc ART00060111_A.jpg

另外,看起来您正试图通过$image->setIteratorIndex(0);,访问第一层;。所以我不知道你为什么会收到这样的信息。你能在终端窗口中尝试我的命令吗?他们在那里工作吗?如果没有,那么您的ImageMagick版本中可能有一个bug

另外,为什么要通过$image->stripImage();;删除配置文件中的jpg;。为了获得最佳的跨平台和各种浏览器查看效果,如果不使用sRGB配置文件,您可以获得更一致的外观效果


您提到的哪个bug导致您必须重新启动Imagick来调整大小?

如果您需要Imagick版本的任何其他信息,请告诉我。Imagick可以从PSD读取的最大通道数是56,但您的图像没有那么多通道。我只能猜测,你的Photoshop版本和ImageMagick开发者可以阅读的版本之间存在一些不兼容。PSD格式是出了名的缺乏文档记录,我注意到失败的图像上有“层效应”——正常工作的图像是否有这些效应,或者是这些效应导致了问题?ImageMagick无法处理层效应或层组等。它只能处理没有图层效果的简单普通图层。处理PSD文件时最好的方法是提取第一层,它应该是平坦层。因此,请执行类似于转换image.psd[0]的操作。。。result.jpgbtw如果只需要第一页,可以使用文件名
$localPath打开图像。“[0]”
如果您需要imagick版本的任何其他信息,请告诉我。imagick可以从PSD读取的最大通道数为56,但您的图像没有那么多通道。我只能猜测,你的Photoshop版本和ImageMagick开发者可以阅读的版本之间存在一些不兼容。PSD格式是出了名的缺乏文档记录,我注意到失败的图像上有“层效应”——正常工作的图像是否有这些效应,或者是这些效应导致了问题?ImageMagick无法处理层效应或层组等。它只能处理没有图层效果的简单普通图层。处理PSD文件时最好的方法是提取第一层,它应该是平坦层。因此,请执行类似于转换image.psd[0]的操作。。。result.jpgbtw如果只需要第一页,可以使用文件名
$localPath打开图像。“[0]”
convert ART00060111_B.psd[0] -profile USWebUncoated.icc -profile sRGB_v4_ICC_preference.icc ART00060111_B.jpg