ReadImage 和 ReadImageFile 之间有什么区别?根据查看页面,您可能会认为它们的行为完全相同,只是在参数上有所不同:ReadImage 获取包含文件文件夹位置的字符串,而 ReadImageFile 获取指向文件位置的句柄。最初,第一个看起来更有吸引力,因为您不必担心 fopen 和 fclose 命令。
但是,ReadImage 函数存在一个问题!使用从此函数创建的数据的 imagemagick 对象,我可以毫无问题地缩放、更改颜色并在对象上执行艺术效果,但随后保存时出现问题:它似乎让我坚持使用原始图像的图像格式(在本例中为“.jpg”,但在其他地方可能有所不同)。一行接一行编写的函数 setImageFormat 和 setFormat 对将格式更改为 png、bmp 或 gif 没有产生任何影响。当我唯一更改的行是将 ReadImage 更改为 ReadImageFile 时,问题完全消失了。
一些示例代码来演示(使用 PHP 版本 5.2.17)。输入文件名:test.jpg。输出文件名:test_result_bad.bmp、test_result_bad.png、test_result_good.bmp、test_result_good.png。生成的的文件大小应该足以让您相信所有错误的文件都只是重复的 jpg...
<?php
$image_file_location = "test.jpg";
$imagick_type_bad = new Imagick();
$imagick_type_good = new Imagick();
$imagick_type_bad->readImage($image_file_location);
$file_handle_for_viewing_image = fopen($image_file_location, 'a+');
$imagick_type_good->readImageFile($file_handle_for_viewing_image);
fclose($file_handle_for_viewing_image);
$file_handle_for_saving_bad_bmp = fopen("test_result_bad.bmp", 'a+');
$imagick_type_bad_bmp = clone $imagick_type_bad;
$imagick_type_bad_bmp->setImageFormat("bmp");
$imagick_type_bad_bmp->setFormat("bmp");
$imagick_type_bad_bmp->writeImageFile($file_handle_for_saving_bad_bmp);
fclose($file_handle_for_saving_bad_bmp);
$file_handle_for_saving_bad_png = fopen("test_result_bad.png", 'a+');
$imagick_type_bad_png = clone $imagick_type_bad;
$imagick_type_bad_png->setImageFormat("png");
$imagick_type_bad_png->setFormat("png");
$imagick_type_bad_png->writeImageFile($file_handle_for_saving_bad_png);
fclose($file_handle_for_saving_bad_png);
$file_handle_for_saving_good_bmp = fopen("test_result_good.bmp", 'a+');
$imagick_type_good_bmp = clone $imagick_type_good;
$imagick_type_good_bmp->setImageFormat("bmp");
$imagick_type_good_bmp->setFormat("bmp");
$imagick_type_good_bmp->writeImageFile($file_handle_for_saving_good_bmp);
fclose($file_handle_for_saving_good_bmp);
$file_handle_for_saving_good_png = fopen("test_result_good.png", 'a+');
$imagick_type_good_png = clone $imagick_type_good;
$imagick_type_good_png->setImageFormat("png");
$imagick_type_good_png->setFormat("png");
$imagick_type_good_png->writeImageFile($file_handle_for_saving_good_png);
fclose($file_handle_for_saving_good_png);
?>