PHP 检测 PNG8 或 PNG24

2024-01-11

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

任何人都知道如何检测图像是否为 PNG8,又名位深度为 8。谢谢!


尝试检测 PNG8、PNG24 和 PNG32:

<?php

$file = new SplFileObject('png8.png');

$realPath = $file->getRealPath();
if ($realPath === false) {
    throw new RuntimeException(sprintf('File not found: %s', $file->getFilename()));
}

$file->rewind();

if ($file->fread(4) !== chr(0x89) . 'PNG') {
    // This is not a PNG
    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 IHDR
if ($idr !== 'IHDR') {
    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 = [
    0 => 'Greyscale',
    2 => 'Truecolour',
    3 => 'Indexed-colour',
    4 => 'Greyscale with alpha',
    6 => 'Truecolour with alpha',
];

$colorTypeText = $colorTypes[$colorType];

$pngType = '?';
// If the bitdepth is 8 and the colortype is 3 (Indexed-colour) you have a PNG8
if ($bitDepth === 8 && $colorType === 3) {
    $pngType = 'PNG8';
}

// If the bitdepth is 8 and colortype is 2 (Truecolour) you have a PNG24.
if ($bitDepth === 8 && $colorType === 2) {
    $pngType = 'PNG24';
}

// If the bitdepth is 8 and colortype is 6 (Truecolour with alpha) you have a PNG32.
if ($bitDepth === 8 && $colorType === 6) {
    $pngType = 'PNG32';
}

echo sprintf('Width: %s, Height: %s, Bit-Depth: %s, Color-Type: %s (%s), Type: %s',
    $width,
    $height,
    $bitDepth,
    $colorType,
    $colorTypeText,
    $pngType
);

Output:

Width: 1500, Height: 500, Bit-Depth: 8, Color-Type: 3 (Indexed-colour), Type: PNG8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 检测 PNG8 或 PNG24 的相关文章

  • PHP7构造函数类名

    我有一个 Laravel 4 2 应用程序 它可以与 PHP5 一起使用 没有任何问题 由于我安装了一个运行 PHP7 的新 vagrant box 一旦我运行一个模型 其中函数名称与类名称 关系函数 相同 就会出现错误 如下所示
  • 如何用javascript正确读取php cookies

    考虑这个 php 和 javascript 代码 然后我在控制台中看到的是 utma 111872281 291759993 1444771465 1445374822 1445436904 4 utmz 111872281 1444771
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组
  • php 表单提交 - Q2

    我对这个虚拟问题感到抱歉 这是我的简单 PHP 表单 其中包含两个 SQL 表和 ADD 提交 按钮 我希望将人员从 Test1 转移到 Test2 很多事情都很好 只有提交按钮不起作用 因此 Test2 表没有反馈 Revised 现在提
  • PHP文件上传

    如果我想在文件名转到服务器的永久位置 而不是临时位置 之前更改文件名 我该如何执行此操作 代码如下
  • Zend Framework Zend_Form 装饰器: 位于按钮元素内部?

    我有一个像这样创建的按钮元素 submit new Zend Form Element Button submit submit gt setLabel My Button submit gt setDecorators array Vie
  • 如何将粘在一起的单词分开?

    我有很多命名不好的文件 videoofmegoingtoschool avi 是否有一个库或某种算法可以正确地将其分离 video of me going to school avi 我不认为那里有什么 我可以想象一个程序 它使用单词词典并
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • 将数据库中的用户 ID 添加到 Codeigniter 中的会话数据中?

    我是 CodeIgniter 的新手 在从数据库添加用户 ID 用户登录后 到会话数据时遇到问题 这是我的代码问题 之前可能会在 SOF 上被问到 在付出了所有努力之后 我问这个 登录模型
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • Yii2 中 init() 和 __construct() 方法有什么区别

    init 方法 public function init construct method public function construct 那么 它们之间有什么区别 应该使用哪一个呢 init 是从以下对象扩展的任何对象的方法yii b
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 重新排列数组键 php [重复]

    这个问题在这里已经有答案了 我有这个数组 Array 15 gt 13 1 16 gt Mark one answer 19 gt You see a car on the hard shoulder of a motorway with
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • PHP 错误:“无法通过引用传递参数 2”

    我只是需要有关这个 PHP 错误的帮助 我不太明白 致命错误 无法在第 13 行 web stud openup inactivatesession php 中通过引用传递参数 2
  • 简单的dom php解析获取自定义数据属性值

    HTML div class something ddsf PHP foreach dom gt find something data rel as this var dump this gt attr 我尝试了这个但错误 在其文档中找不
  • 如何确保在 PHP 的“foreach”循环中重置该值?

    我正在写一个简单的 PHP 页面和一些foreach使用了循环 以下是脚本 arrs array a b c foreach arrs as arr if substr arr 0 1 b echo This is b End of fir
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f
  • 如何使用配置文件 (.ebextensions) 在 AWS Elastic Beanstalk 上安装 PHP IMAP 扩展?

    有谁知道如何使用配置文件 ebextensions 在 AWS Elastic Beanstalk 上安装和启用 PHP IMAP 扩展 我使用的是 64 位 Amazon Linux 2017 03 v2 4 0 运行 PHP 7 0 1

随机推荐

  • SPARQL 查询未产生预期结果

    我使用此 SPARQL 查询来获取欧洲国家 地区列表 SELECT item itemLabel WHERE item wdt P31 wd Q6256 item wdt P30 wd Q46 item wdt P361 wd Q46 it
  • ASP.NET Core 解决方案是否可以包含具有不同目标框架的项目?

    Like so 一种解决方案 我认为这一定是 ASP NET Core 项目1 目标框架是 NET Core 2 1 项目2 目标框架是 NET Framework 4 5 1 处理数据访问的类库 我问的原因是项目 2 包含我们目前没有时间
  • 带 iOS 7 状态栏的文档交互控制器?

    The UIDocumentInteractionController似乎无法与新的 iOS 7 状态栏正确交互 尤其是在横向状态下 我现在用于显示查看器的代码 void viewDidAppear BOOL animated super
  • 我需要 mongoose 和 graphql 吗?

    如果我想将 mongo 数据库连接到 graphql 模式 我是否需要 mongoose ORM 或者我可以只进行原始驱动程序调用吗 你可以两者都做 如果您已经定义了猫鼬模型 则可以在编写时使用它们resolve功能 请参阅下面的例子 ht
  • 使用.AsString 还是.Text?

    我刚刚看到了他们使用的一些代码 D5 aStr tblAcct FieldByName Name Text 看起来效果不错 但我一直用 aStr tblAcct FieldByName Name AsString 我在加载 TMemo 时使
  • Silverlight自定义Tabcontrol设计

    我是开发新手 打算使用 Silverlight 开发一个基于 Windows 的项目 我选择制作一个 OOB 应用程序 silerlight Out Of Browser 应用程序 在我的项目中 我将使用 TabControl 我能够在 M
  • php 邮件头中的哪个换行符,\r\n 或 \n?

    我见过很多使用 php 邮件功能的例子 其中一些使用 r n 作为标题的换行符 有些使用 n headers From Just Me n headers Reply To Just me lt email gt n vs headers
  • Div - onblur 函数

    我想打电话给onblur on div 不知道如何完成它 尝试过这个 div onblur javascript callme 但没用 For blur要在元素上触发事件 该元素需要首先接收焦点 但 div 默认情况下 元素不会获得焦点 你
  • 将多个文本文件导入 Matlab 来分析数据 [重复]

    这个问题已经存在了 我对matlab确实是个新手 所以我正在努力学习最基本的知识 我有 8 个 tsv 文件 名称如 2004 07 01 0000 tsv 2004 07 01 0300 tsv 其中每个文件有 72 行和 144 列 我
  • 在 IIS 上使用 PHP 进行 Windows 身份验证

    我正在开发一个在 IIS 上用 PHP 构建的 Intranet 应用程序 我想通过使用 Windows 身份验证将用户名自动从浏览器传递到 IIS 来针对 AD 进行身份验证 有办法做到这一点吗 是的 IIS 支持集成 Windows 身
  • 从经典 ASP 连接到 SQL Server 2008 的命名实例

    我的 ASP 应用程序可以毫无问题地连接到安装了 SQL Server 2000 的网络服务器 有效的旧代码 myConn Open Driver SQL Server Server myNetwrkServer Database myDB
  • 如何在 ASP.NET 中使用 C# 从数据库检索二进制图像

    我需要从数据库中检索二进制图像 我的疑问如下 SqlConnection con new SqlConnection Data Source localhost Initial Catalog MyGames Integrated Secu
  • CentOS 上 Laravel 的权限问题

    我已将 laravel 存储库克隆到我的 CentOS 7 机器上 当我尝试运行它时 出现 500 错误且没有任何显示 所以我检查一下 var log httpd error log我发现我遇到了一些权限错误 Mon May 16 11 3
  • 如何使用代码实现关机

    有没有一种方法可以使用代码关闭手机 我对此一无所知 希望有人给我一些建议 或者示例 代码 api 谢谢 这是一个完整的例子 https github com rbochet AutoShutdown https github com rbo
  • 如何从这种关系中选择条目?

    我有这四个表 提要 提要条目 条目类别和类别 有了这些结构 CREATE TABLE categorias id int 11 NOT NULL auto increment nome varchar 100 collate utf8 un
  • Chrome 会阻止不同来源的请求

    当脚本尝试从不同来源访问框架时 Chrome 会阻止它并抛出异常 如下所示 未捕获的安全错误 阻止具有来源 提供商域 的框架访问具有来源 mydomain 的框架 协议 域和端口必须匹配 在 google chrome 进行一些更新后 我收
  • 如何让程序等待 JavaScript 中的变量更改?

    我想强制 JavaScript 程序在执行的某些特定点等待 直到变量发生更改 有办法做到吗 我已经找到了一个名为 narrative JavaScript 的扩展 它强制程序等待事件发生 有没有办法创建一个新事件 例如 变量更改事件 其行为
  • PHP多维数组转无序列表,建立url路径

    我在 PHP 中有一个多维数组 由 icio 和 ftrotter 的优秀示例生成 我在数组变体中使用 ftrotterrs 数组 将数据库结果转为数组 https stackoverflow com questions 2794638 t
  • 在哪里/如何下载(并安装)适用于 Windows 8 64 位的 Microsoft.Jet.OLEDB.4.0?

    我有一个使用 Jet OLEDB 4 0 的 32 位 net 2 0 应用程序 它可以在 Windows 8 32 位上运行 但不能在 64 位上运行 在 64 位上我收到错误 Microsoft Jet OLEDB 4 0 提供程序未在
  • PHP 检测 PNG8 或 PNG24

    我需要一种简单的方法来检测正在上传的 PNG 内容 我尝试了 getimagesize 但它返回 PNG8 和 PNG24 的位 8 任何人都知道如何检测图像是否为 PNG8 又名位深度为 8 谢谢 尝试检测 PNG8 PNG24 和 PN