使用PHP和jQuery快速旋转图像

1 投票
3 回答
919 浏览
提问于 2025-04-16 03:01

我写了一个Python脚本,可以把图片旋转90度。如果你想看看代码,我把它放在下面;

#! /usr/bin/python
# This Python file uses the following encoding: utf-8


#argv[1] needs to be send formatted meaning spaces and paranthesis ARE problems

__author__="john"
__date__ ="$Aug 17, 2010 1:48:36 PM$"

server_directory="some_directory"

import os
import os.path
import sys
import Image

#for turkish characters
def tr(utf):
    return utf.decode('utf-8')

img_directory=sys.argv[1]
img_directory_orig=img_directory.replace("\ ", " ")
file_url_and_name=server_directory+img_directory_orig
im = Image.open(file_url_and_name)
im1=im.rotate(270)
out=file(file_url_and_name,"w")
im1.save(out,"JPEG")
out.close()

这很简单。所以我之前的做法是,当点击一个链接时,示例链接如下;

echo '<div style="text-align: center ;margin-left: auto ; margin-right: auto ;"><a class="button" href="fotograf.php?open='.$going_to_open_dir.'&rotate=temp/'."m_".$fake_going_to_open_dir."_".$fake_entry.'&num=foto'.$a1.'" onclick="this.blur();"><span>90&deg; turn</span></a></div>';

到目前为止都还不错。哦,我还想加上调用我这个小Python应用的PHP代码;

if(isset($_GET["rotate"]))
    {
        exec("python rotate_image.py ".$_GET["rotate"]);
        header("location: fotograf.php?open=".$_GET['open']."&num=".$_GET['num']."#".$_GET['num']);
    }

我的问题是:虽然我的系统可以正常工作,但速度太慢了。特别是每次有大约600张图片需要加载的时候,每转动一张图片就显得特别慢。我想知道有没有办法用jQuery(Ajax)来加速这个过程?基本上,我想做的是:在网页上旋转600张图片中的一张,并把旋转后的版本保存到服务器,而不需要重新加载整个页面。

3 个回答

0

具体来说,哪个部分太慢了呢?其实有很多方法可以加快这个速度:

  • 把旋转过的图片缓存起来。这是最明显的办法。
  • 在页面加载的时候就把旋转过的图片加载进来,并设置为不可见。这样浏览器就会把它们缓存起来。
  • 用AJAX请求这些图片。
1

如果你愿意在浏览器里直接操作的话,这篇文章里的技巧可以让你旋转任何HTML内容,包括图片标签。

-webkit-transform: rotate(-90deg); 
-moz-transform: rotate(-90deg); 
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
0

你似乎每次从PHP脚本请求时都在创建旋转后的版本。检查一下这个文件是否已经存在,如果存在就不要再旋转了。

换句话说,在你的PHP脚本中,先检查一下之前是否已经生成过旋转后的文件。如果已经生成过,就不要再运行Python脚本了,直接跳转到那个旋转后的文件就可以了。

现在你所做的事情是这样的 - 在任何操作之前:

somefile.jpg

request.php?rotate=somefile.jpg:

rotate? yes -> exec python script

在脚本完成后(文件名具体是什么并不重要):

somefile.jpg
somefile_rotated.jpg

所以,这时候在请求somefile.jpg时,你其实不需要再执行Python脚本,但你还是在执行:

request.php?rotate=somefile.jpg:

rotate? yes -> exec python script // even though you already have the output file

你可以这样做:

request.php?rotate=somefile.jpg:

rotate? yes 
did we rotate the file already?  (=is there a rotated version on our server?)
   -> yes, redirect to it
   -> no, exec python script, then redirect to the rotated file

撰写回答