1

我正在尝试拍照并创建缩略图,而不会丢失包含版权信息和其他信息的 IPTC 信息。我正在使用 GD 编写脚本来调整大小,这当然会导致 IPTC 数据丢失,因为它会创建一个全新的文件,而不是实际调整原始文件的大小。因此,我的解决方案是从原始图像中提取 IPTC 数据,然后将其嵌入缩略图中。到目前为止,一切运行良好,并且生成了缩略图,除了 IPTC 数据没有被复制。我的代码片段如下。谁能看到我错过的任何东西?这是基于 iptcembed() 的 PHP 手册中的示例。哦,是的,我在 Zend 框架中工作,但除了注册表来处理配置之外,这是非常简单的 OOP 代码。谢谢!

        public function resizeImage($image, $size)
    {
            // Get Registry
            $galleryConfig = Zend_Registry::get('gallery_config');

            $path = APPLICATION_PATH . $galleryConfig->paths->mediaPath . $image->path . '/';
            $file = $image->filename . '.' . $image->extension;
            $newFilename = $image->filename . '_' . $size . '.' . $image->extension;

            // Get Original Size
            list($width, $height) = getimagesize($path . $file);

            // Check orientation, create scalar
            if($width > $height){
                    $scale = $width / $size;
            }else{
                    $scale = $height / $size;
            }

            // Set Quality
            switch($size){
                    case ($size <= 200):
                            $quality = 60;
                            break;
                    case ($size > 200 && $size <= 600):
                            $quality = 80;
                            break;
                    case ($size > 600):
                            $quality = 100;
                            break;
            }

            // Recalculate new sizes with default ratio
            $new_width = round($width * (1 / $scale));
            $new_height = round($height * (1/ $scale));

            // Resize Original Image
            $imageResized = imagecreatetruecolor($new_width, $new_height);
            $imageTmp     = imagecreatefromjpeg ($path.$file);
            imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

            // Save File
            $complete = imagejpeg($imageResized, $path . $newFilename, $quality);

            // Copy IPTC info into new file
            $imagesize = getImageSize($path . $file, $info); 
            if(isset($info['APP13'])){ 
            $content = iptcembed($info['APP13'], $path . $newFilename); 
               $fw = fopen($path . $newFilename , 'wb'); 
               fwrite($fw, $content); 
               fclose($fw); 
            }

    }
4

1 回答 1

0

我认为 iptcembed 确实会自动保存文件,这意味着 php.net 手册示例是错误的:

返回值 如果成功且假脱机标志低于 2,则 JPEG 将不会作为字符串返回,错误时返回 FALSE。

http://php.net/iptcembed

于 2011-04-09T14:21:23.650 回答