首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像编辑的数学

图像编辑的数学
EN

Stack Overflow用户
提问于 2012-05-02 16:51:36
回答 1查看 244关注 0票数 2

我正在用PHP和Javascript创建一个图像编辑程序,但我不能计算出数学。

这个想法是,用户上传一个图像(它可以非常大,10000x10000像素,也可以小500x500像素),然后用PHP调整它的大小以适应工作区(调整到更小或更大)。工作区根据用户屏幕大小计算(使用Javascript)。存储原始图像并生成thumb。此时,用户可以旋转和裁剪图像。裁剪和旋转是用拇指图像来完成的,以节省资源(使用PHP)。数据保存到会话中(数据如旋转角度、裁剪- x、y、宽、高、调整大小-宽高比(original_image_width / thumb_image_width))。当用户单击完成按钮时,所有这些步骤都将应用于原始图像。如果它在旋转,则计算总角度,以避免多次调用旋转函数。如果是裁剪,则必须计算xywidthheight,以便裁剪只发生一次。

这就是它变得复杂的地方。由于每次裁剪之间都会调整大小(以适应工作区),因此我似乎无法计算出计算所需变量(xywidthheight)的数学公式。这是我到目前为止所拥有的。

代码语言:javascript
复制
list($width_original, $height_original) = getimagesize($_SESSION['original_file']);

// default variables
$angle = 0; $x = 1; $y = 1; $width = $width_original; $height = $height_original; $xx = 0; $yy = 0;
$ratio_x = 1; $ratio_y = 1;

foreach($_SESSION['history'] as $key => $history)
{
    if($history['action'] == 'resize')
    {
        $ratio_x = $history['ratio_x'];
        $ratio_y = $history['ratio_y'];
    }

    if($history['action'] == 'crop')
    {
        $xx += ($width * $history['x']) / ($history['width'] * $ratio_x);
        $yy += ($height * $history['y']) / ($history['height'] * $ratio_y);

        $x = $history['x'];
        $y = $history['y'];
        $width = $history['width'] * $ratio_x;
        $height = $history['height'] * $ratio_y;

    }
}

这个想法是从最后一个拇指(调整大小,适合工作区的较小或较大的图片)计算xy,并将它们相加。在此之后,默认变量将替换为当前的历史值。

我希望我说得很清楚了。我的大脑再也想不通了,有谁能给我指路吗?

编辑:我忘记添加会话数据了。它看起来是这样的:

代码语言:javascript
复制
Array
(
[history] => Array
    (
        [0] => Array
            (
                [action] => crop
                [x] => 173
                [width] => 629
                [y] => 124
                [height] => 208
                [file] => 4fa0f6ffe5844.jpg
            )

        [1] => Array
            (
                [action] => resize
                [ratio_x] => 0.69659863945578
                [ratio_y] => 1.1851851851852
            )

        [2] => Array
            (
                [action] => crop
                [x] => 200
                [width] => 1236
                [y] => 254
                [height] => 66
                [file] => 4fa0f70256940.jpeg
            )

        [3] => Array
            (
                [action] => resize
                [ratio_x] => 0.69659863945578
                [ratio_y] => 7.3846153846154
            )

    )

[id] => e03859m172blidbjl1sj8kfm94
[original_file] => 4fa0f6ffe5844.jpg
[current_file] => 4fa0f705e19d6_final.jpeg
[landscape] => 1
[workarea_height] => 613
[workarea_width] => 1470
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-02 17:21:28

如果我没理解错的话,你想做镜像编辑,比如cropre-size等等,但是从你的代码中有一些我不理解的东西,比如

我不确定为什么要遍历历史记录,为什么会有多个

  • $history
  • foreach($_SESSION['history'] as $key => $history)
  • $ratio_x = 1; $ratio_y = 1;

我对你的javascript的期望是这样的:

  • x1,y1
  • x2,y2
  • angle

在大多数情况下,可能不需要x2y2,特别是当用户只想重新调整大小时。你不需要xy的比率...一个单一的定量或刻度就可以了。

简单计算

代码语言:javascript
复制
$ratio = $thumb_width/$width_original;
$newImageWidth = ceil($width * $ratio);
$newImageHeight = ceil($height * $ratio);

结论

有很多开放源码的java脚本解决方案,你可以看到它们都有PHP后端

http://www.webmotionuk.co.uk/php-jquery-image-upload-and-crop/

http://odyniec.net/projects/imgareaselect/

http://deepliquid.com/content/Jcrop_Download.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10410490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档