Php 调整图像大小以接近像素数
我想防止添加到电子邮件附件的JPG图像为250kB或更小。我发现,对于JPG图像,这是非常非线性的,所以我做了一些测试,决定2000000像素是我能允许的最大值 所以现在,我需要将每个图像的大小调整为2000000像素或尽可能接近的值。然而,这听起来很不可能:Php 调整图像大小以接近像素数,php,image-processing,resize,Php,Image Processing,Resize,我想防止添加到电子邮件附件的JPG图像为250kB或更小。我发现,对于JPG图像,这是非常非线性的,所以我做了一些测试,决定2000000像素是我能允许的最大值 所以现在,我需要将每个图像的大小调整为2000000像素或尽可能接近的值。然而,这听起来很不可能: x2*y2 = 2000000 x2/y2 = x/y //The aspect ratio must be the same 那么解决这个问题的办法是什么呢 我对这个问题的看法是: 对于NxN图像,比率等于1。(N=N当然)
x2*y2 = 2000000
x2/y2 = x/y //The aspect ratio must be the same
那么解决这个问题的办法是什么呢
我对这个问题的看法是:
NxN
图像,比率等于1。(N
=N
当然)x=y=sqrt(9)=3
NxM
图像,其中N=M
和M∨N=1
比率为1/M或N/1。对于p
像素,图像将具有x=p
y=1
,反之亦然从点3.我确实知道X和Y都是介于
1
和sqrt(p)
之间的值,所以,毕竟,这里有一个答案(因为在座的各位显然不做数学)
方程的程序实现是这样的:
function image_resize_to_pixel_count($im, $pixels) {
$x = imagesx($im);
$y = imagesy($im);
$S = $pixels; //I use S here to remind you, that it's analogic to rectangle area
//Define the coefficient for $x, $y (old image dimensions)
$h = sqrt($S/($x*$y));
$x2 = round($h*$x);
$y2 = round($h*$y);
//Standard resize to x, y procedure follows from here
}
制作一个像素和字节过多的随机图像:
convert -size 3000x1000 xc:red +noise random image.jpg
检查大小,是的,超过10MB
-rw-r--r-- 1 mark staff 10454067 9 Jan 12:03 image.jpg
现在,在保留像素尺寸的同时,将其减小到250kB:
convert image.jpg -define jpeg:extent=250k result.jpg
检查文件大小(以字节为单位),是的,现在约为250kB:
-rw-r--r--@ 1 mark staff 259356 9 Jan 12:08 result.jpg
或者,减少像素尺寸,直到像素总数小于2000000:
convert image.jpg -resize 2000000@ result.jpg
检查尺寸,是在2000000像素以下,并且仍然以相同的3:1比率
identify result.jpg
result.jpg JPEG 1732x1154 1732x1154+0+0 8-bit sRGB 2.70352MiB 0.000u 0:00.000
看,我们可以做数学-只是慢慢来!!!什么是5年?您想将较大的图像重新处理为较小的图像,还是仅仅阻止用户上传超过您的大小限制的图像?只有较大的图像才能调整大小。是的,它们必须调整大小,而不是拒绝。谢谢你的评论,但是我知道如何在PHP中调整IMAG的大小。您可能已经注意到,
imagecopyresized
要求两个图像的宽度和高度,而不仅仅是源图像。