在Linux控制台中,如果使用return response()->download($pathToFile, $name, $headers);
,它会为您提供文件的完整打印。反正有没有在php中获得相同的信息?
具体来说,我需要“Type”行来说明png的类型。 TrueColorAlpha,PaletteAlpha等等。
为什么吗 操作系统损坏并试图重建超过500万个图像的结构,其中200万个被丢弃并被发现。其中一些是系统创建的,其中一些是上传的。如果我能找到两者之间的差异,那将节省大量时间。
答案 0 :(得分:1)
从这些文章中我写了一个简单的函数,而不是给你PNG文件的颜色类型:
https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header
http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html
简而言之:PNG文件由标题和块组成。在第二个字节的标题中,第四个字节应该是ASCII字符串等于“PNG”,然后是名称为4个字节的块。 IHDR块为您提供有关图像的一些数据,如高度和所需的颜色类型。这个块的位置总是固定的,因为它始终是第一个块。它的内容在我给你的第二个链接中描述:
IHDR块必须首先出现。它包含:
Width: 4 bytes
Height: 4 bytes
Bit depth: 1 byte
Color type: 1 byte
Compression method: 1 byte
Filter method: 1 byte
Interlace method: 1 byte
因此,知道标题的长度,块名称的长度及其结构,我们可以计算颜色类型数据的位置,它是26字节。现在我们可以编写一个简单的函数来读取PNG文件的颜色类型。
function getPNGColorType($filename)
{
$handle = fopen($filename, "r");
if (false === $handle) {
echo "Can't open file $filename for reading";
exit(1);
}
//set poitner to where the PNG chunk shuold be
fseek($handle, 1);
$mime = fread($handle, 3);
if ("PNG" !== $mime) {
echo "$filename is not a PNG file.";
exit(1);
}
//set poitner to the color type byte and read it
fseek($handle, 25);
$content = fread($handle, 1);
fclose($handle);
//get integer value
$unpack = unpack("c", $content);
return $unpack[1];
}
$filename = "tmp/png.png";
getPNGColorType($filename);
这是颜色类型命名法(来自第二个链接):
Color Allowed Interpretation
Type Bit Depths
0 1,2,4,8,16 Each pixel is a grayscale sample.
2 8,16 Each pixel is an R,G,B triple.
3 1,2,4,8 Each pixel is a palette index;
a PLTE chunk must appear.
4 8,16 Each pixel is a grayscale sample,
followed by an alpha sample.
6 8,16 Each pixel is an R,G,B triple,
我希望这会有所帮助。
答案 1 :(得分:-1)
使用PHP Executing a Bash script from a PHP script
中的Bash代码执行此操作<?php
$type=shell_exec("identify -verbose $filename");
print_r($type);
?>