Php 调整图像大小以接近像素数

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当然)

我想防止添加到电子邮件附件的JPG图像为250kB或更小。我发现,对于JPG图像,这是非常非线性的,所以我做了一些测试,决定2000000像素是我能允许的最大值

所以现在,我需要将每个图像的大小调整为2000000像素或尽可能接近的值。然而,这听起来很不可能:

x2*y2 = 2000000
x2/y2 = x/y      //The aspect ratio must be the same
那么解决这个问题的办法是什么呢

我对这个问题的看法是:

  • 对于
    NxN
    图像,比率等于1。(
    N
    =
    N
    当然)
  • 对于9个像素和比率1:
    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
    要求两个图像的宽度和高度,而不仅仅是源图像。