在 PHP 中保存到磁盘之前计算图像文件大小
Calculate image file size before saving to Disk in PHP
我正在试验 PHP 图片保存。
我想比较图像的实际文件大小上传前和resize/compress处理后,但想知道文件大小如果我将它保存到磁盘。
如果文件较小,则新处理的文件将替换旧文件,否则不做任何更改。
这是我用来保存 jpeg 图像的代码。
imagejpeg($this->newImage, $savePath, $imageQuality);
我尝试在
之后获取实际文件大小和大小
print_r(filesize($actual_file_size));
print_r($this->newImage);
其中 $actual_file_size 通过从 tmp 目标文件读取数据,但是 $this->newImage 给出空白(无值)。
我正在使用来自 github
的 ResizeImage class
有什么方法可以在保存到磁盘之前获取文件大小?这样我就可以保留最小尺寸的版本。
在将其保存到磁盘之前无法计算大小。我建议你创建某种 temporary
文件夹来保存图像,然后检查大小,如果它是你想要的,将它移动到你认为合适的文件夹,如果你不想保存它,将它从temporary
个文件夹。
不是真的。
有办法..
以下代码适用于 JPEG 和 PNG :-)
///######## GET THE TOTAL PIXELS
$total_pixels = $image_width * $image_height;
$size_at_max = (3 * $total_pixels) * 0.001; /// **** IN KB
你是这样做的:
$original_file = 'original.jpg';
$resized_file = 'resized.jpg';
$max_file_size = '10000';
$original_image = imagecreatefromjpeg($original_file);
$image_quality = 100;
do {
$temp_stream = fopen('php://temp', 'w+');
$saved = imagejpeg($original_image, $temp_stream, $image_quality--);
rewind($temp_stream);
$fstat = fstat($temp_stream);
fclose($temp_stream);
$file_size = $fstat['size'];
}
while (($file_size > $max_file_size) && ($image_quality >= 0));
if (-1 == $image_quality) {
echo "Unable to get the file that small. Best I could do was $file_size bytes at image quality 0.\n";
}
else {
echo "Successfully resized $original_file to $file_size bytes using image quality $image_quality. Resized file saved as $resized_file.\n";
imagejpeg($new_image, $resized_file, $image_quality + 1);
}
在您成功找到理想的压缩比之前,不需要写入任何文件。
此循环以 $image_quality 100 开始,然后向下计数,在临时 in-memory 缓冲区中尝试每个新值。如果尝试 0 而文件仍然太大,它 returns 一条错误消息。否则,如果它达到一个有效的值,它会报告并使用该图像质量设置保存新文件。
如果您喜欢冒险,您可以实施二进制搜索算法以更快地找到理想的压缩比,但是 quick-fix 给出相同的结果,尽管可能稍微慢一些。
我正在试验 PHP 图片保存。 我想比较图像的实际文件大小上传前和resize/compress处理后,但想知道文件大小如果我将它保存到磁盘。
如果文件较小,则新处理的文件将替换旧文件,否则不做任何更改。
这是我用来保存 jpeg 图像的代码。
imagejpeg($this->newImage, $savePath, $imageQuality);
我尝试在
之后获取实际文件大小和大小print_r(filesize($actual_file_size));
print_r($this->newImage);
其中 $actual_file_size 通过从 tmp 目标文件读取数据,但是 $this->newImage 给出空白(无值)。
我正在使用来自 github
的 ResizeImage class有什么方法可以在保存到磁盘之前获取文件大小?这样我就可以保留最小尺寸的版本。
在将其保存到磁盘之前无法计算大小。我建议你创建某种 temporary
文件夹来保存图像,然后检查大小,如果它是你想要的,将它移动到你认为合适的文件夹,如果你不想保存它,将它从temporary
个文件夹。
不是真的。 有办法..
以下代码适用于 JPEG 和 PNG :-)
///######## GET THE TOTAL PIXELS
$total_pixels = $image_width * $image_height;
$size_at_max = (3 * $total_pixels) * 0.001; /// **** IN KB
你是这样做的:
$original_file = 'original.jpg';
$resized_file = 'resized.jpg';
$max_file_size = '10000';
$original_image = imagecreatefromjpeg($original_file);
$image_quality = 100;
do {
$temp_stream = fopen('php://temp', 'w+');
$saved = imagejpeg($original_image, $temp_stream, $image_quality--);
rewind($temp_stream);
$fstat = fstat($temp_stream);
fclose($temp_stream);
$file_size = $fstat['size'];
}
while (($file_size > $max_file_size) && ($image_quality >= 0));
if (-1 == $image_quality) {
echo "Unable to get the file that small. Best I could do was $file_size bytes at image quality 0.\n";
}
else {
echo "Successfully resized $original_file to $file_size bytes using image quality $image_quality. Resized file saved as $resized_file.\n";
imagejpeg($new_image, $resized_file, $image_quality + 1);
}
在您成功找到理想的压缩比之前,不需要写入任何文件。
此循环以 $image_quality 100 开始,然后向下计数,在临时 in-memory 缓冲区中尝试每个新值。如果尝试 0 而文件仍然太大,它 returns 一条错误消息。否则,如果它达到一个有效的值,它会报告并使用该图像质量设置保存新文件。
如果您喜欢冒险,您可以实施二进制搜索算法以更快地找到理想的压缩比,但是 quick-fix 给出相同的结果,尽管可能稍微慢一些。