我正在使用ImageMagick为已经上传的PDF创建一个微小的JPG缩略图。代码工作正常。这是一个WordPress小部件,尽管这不一定是WordPress特定的。
我不熟悉 ImageMagick,所以我希望有人能告诉我这看起来很糟糕,或者没有遵循某种最佳实践,或者我是否有使服务器崩溃的风险。
具体来说,我的问题是:
- 该图像是否已缓存,还是服务器必须在每次有人查看页面时重新生成图像?如果未缓存,确保服务器不必重新生成缩略图的最佳方法是什么?
- 我试图为 ImageMagick 创建一个单独的文件夹 (/thumbs) 来放置所有图像,而不是用 PDF 的图像弄乱 WP 上传文件夹。尽管在我的测试环境中对该文件夹有 777 个权限,但它一直抛出权限错误。为什么?源/目标目录是否必须相同?
- 我在这里做的任何错误/低效的事情需要改进吗?
整个小部件位于Pastebin上:http://pastebin.com/WnSTEDm7
相关代码:
<?php
if ( $url ) {
$pdf = $url;
$info = pathinfo($pdf);
$filename = basename($pdf,'.'.$info['extension']);
$uploads = wp_upload_dir();
$file_path = str_replace( $uploads['baseurl'], $uploads['basedir'], $url );
$dest_path = str_replace( '.pdf', '.jpg', $file_path );
$dest_url = str_replace( '.pdf', '.jpg', $pdf );
exec("convert '"{$file_path}[0]'" -colorspace RGB -geometry 60 $dest_path"); ?>
<div class="entry">
<div class="widgetImg">
<p><a href="<?php echo $url; ?>" title="<?php echo $filename; ?>"><?php echo "<img src='".$dest_url."' alt='".$filename."' class='blueBorder' />"; ?></a></p>
</div>
<div class="widgetText">
<?php echo wpautop( $desc ); ?>
<p><a class="downloadLink" href="<?php echo $url; ?>" title="<?php echo $filename; ?>">Download</a></p>
</div>
</div>
<?php }
?>
如您所见,该小部件抓取附加到当前正在查看的页面的任何PDF,创建PDF第一页的图像,存储它,然后以HTML形式链接到它。
感谢您的任何帮助!
当您另存为 jpg 时,请尝试将 -define 添加到您的代码中:
exec("convert -define jpeg:size=60x60 '"{$file_path}[0]'" -colorspace RGB -geometry 60 $dest_path"); ?>
60x60 是图像的最终大小 - 它所做的只是读取足够的数据来创建图像,从而加快读取过程。
调整保持宽高比,然后裁剪为 60x60
exec("convert -define jpeg:size=60x60 '"{$file_path}[0]'" -colorspace RGB -thumbnail 60x60 -gravity center -crop 60x60+0+0 +repage $dest_path"); ?>
所以我认为ImageMagick在每个页面视图上重新生成缩略图。带有此小部件的页面将需要额外的几秒钟才能加载。
因此,它现在进行简单的检查以查看缩略图是否已经存在:
if ( !file_exists( $dest_path ) ) {
exec("convert '"{$file_path}[0]'" -colorspace RGB -geometry 60 $dest_path");
};
加载需要 ~5 秒的页面现在需要 2-3 秒。
无论如何,我仍然有兴趣知道是否有任何PHP人认为这可以做得更好。
希望这段代码对某人有所帮助。