PHP 检测 PNG8 或 PNG24

我需要一种简单的方法来检测正在上传的 PNG 文件。我尝试过 getimagesize 但它返回 PNG8 和 PNG24 的第 8 位。

任何人都知道如何检测图像是 PNG8,也就是 8 位深度。谢谢!


侃侃无极
浏览 186回答 1
1回答

翻阅古今

试试这个来检测 PNG8、PNG24 和 PNG32:<?php$file = new SplFileObject('png8.png');$realPath = $file->getRealPath();if ($realPath === false) {&nbsp; &nbsp; throw new RuntimeException(sprintf('File not found: %s', $file->getFilename()));}$file->rewind();if ($file->fread(4) !== chr(0x89) . 'PNG') {&nbsp; &nbsp; // This is not a PNG&nbsp; &nbsp; throw new RuntimeException(sprintf('Invalid PNG file: %s', $file->getFilename()));}$file->rewind();$file->fread(8 + 4);$idr = $file->fread(4);// Make sure we have an IHDRif ($idr !== 'IHDR') {&nbsp; &nbsp; throw new RuntimeException('No PNG IHDR header found, invalid PNG file.');}// PNG actually stores Width and height integers in big-endian.$width = unpack('N', (string)$file->fread(4))[1];$height = unpack('N', (string)$file->fread(4))[1];// Bit depth: 1 byte// Bit depth is a single-byte integer giving the number of bits per sample or// per palette index (not per pixel).//// Valid values are 1, 2, 4, 8, and 16, although not all values are allowed for all color types.$bitDepth = ord((string)$file->fread(1));// Pixel format// https://en.wikipedia.org/wiki/Portable_Network_Graphics#Pixel_format// Color type is a single-byte integer that describes the interpretation of the image data.// Color type codes represent sums of the following values:// 1 (palette used), 2 (color used), and 4 (alpha channel used).//// Valid values are 0, 2, 3, 4, and 6.$colorType = ord((string)$file->fread(1));$colorTypes = [&nbsp; &nbsp; 0 => 'Greyscale',&nbsp; &nbsp; 2 => 'Truecolour',&nbsp; &nbsp; 3 => 'Indexed-colour',&nbsp; &nbsp; 4 => 'Greyscale with alpha',&nbsp; &nbsp; 6 => 'Truecolour with alpha',];$colorTypeText = $colorTypes[$colorType];$pngType = '?';// If the bitdepth is 8 and the colortype is 3 (Indexed-colour) you have a PNG8if ($bitDepth === 8 && $colorType === 3) {&nbsp; &nbsp; $pngType = 'PNG8';}// If the bitdepth is 8 and colortype is 2 (Truecolour) you have a PNG24.if ($bitDepth === 8 && $colorType === 2) {&nbsp; &nbsp; $pngType = 'PNG24';}// If the bitdepth is 8 and colortype is 6 (Truecolour with alpha) you have a PNG32.if ($bitDepth === 8 && $colorType === 6) {&nbsp; &nbsp; $pngType = 'PNG32';}echo sprintf('Width: %s, Height: %s, Bit-Depth: %s, Color-Type: %s (%s), Type: %s',&nbsp; &nbsp; $width,&nbsp; &nbsp; $height,&nbsp; &nbsp; $bitDepth,&nbsp; &nbsp; $colorType,&nbsp; &nbsp; $colorTypeText,&nbsp; &nbsp; $pngType);输出:Width: 1500, Height: 500, Bit-Depth: 8, Color-Type: 3 (Indexed-colour), Type: PNG8
打开App,查看更多内容
随时随地看视频慕课网APP