我正在用 PHP 和 Javascript 创建一个图像编辑程序,但我无法计算出数学。
这个想法是,用户上传一张图片(它可以非常大,10 000 x 10 000 像素,也可以很小 500 x 500 像素),并使用 PHP 调整其大小以适应工作区域(调整为更小或更大)。工作区是根据用户屏幕大小计算的(使用 Javascript)。存储原始图像并生成拇指。此时,用户可以旋转和裁剪图像。使用拇指图像进行裁剪和旋转以节省资源(使用 PHP)。数据保存到会话中(数据如旋转角度、裁剪 - x、y、宽度、高度、调整大小 - 宽度和高度的比率 ( original_image_width / thumb_image_width
))。当用户单击完成按钮时,所有这些步骤都将应用于原始图像。如果它正在旋转,则计算总角度以避免多次调用旋转函数。如果是裁剪,则x
, y
,width
和height
必须计算使得裁剪只发生一次。
现在这是变得复杂的地方。由于调整大小发生在每次裁剪之间(以适应工作区域),我似乎无法计算出数学来计算所需的变量(x
, y
, width
, height
)。这是我到目前为止所拥有的。
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;
}
}
这个想法是计算x
并y
从最后一个拇指(它调整大小,适合工作区域的更小或更大的图片)并将它们加在一起。之后,默认变量将替换为当前历史值。
我希望我说清楚了。我的头脑无法再弄清楚了,谁能指出我正确的方向?
编辑:我忘了添加会话数据。它看起来像这样:
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
)