Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查PNG的灰度/alpha颜色类型?_Php_Png_Gd - Fatal编程技术网

Php 如何检查PNG的灰度/alpha颜色类型?

Php 如何检查PNG的灰度/alpha颜色类型?,php,png,gd,Php,Png,Gd,当使用imagecreatefromfrompng()时,PHP和GD似乎很难从带有alpha的greyscale类型的PNG创建图像。结果是难以置信的扭曲 我想知道是否有人知道测试颜色类型的方法,以便通知用户不兼容 例如: 原始图像: 结果图像: 代码: 查看此答案 : 对于使用ImageCreateFromPng的用户,另一个有用的注意事项是: PHP和GD无法识别灰度/alpha图像 因此,如果使用透明度介于0%和100%之间的灰度图像,则将图像另存为RGB。 至少在PHP版本4.4.2-

当使用
imagecreatefromfrompng()
时,PHP和GD似乎很难从带有alpha的greyscale类型的PNG创建图像。结果是难以置信的扭曲

我想知道是否有人知道测试颜色类型的方法,以便通知用户不兼容

例如:

原始图像:
结果图像:

代码:

查看此答案 :

对于使用ImageCreateFromPng的用户,另一个有用的注意事项是: PHP和GD无法识别灰度/alpha图像

因此,如果使用透明度介于0%和100%之间的灰度图像,则将图像另存为RGB。

至少在PHP版本4.4.2-1和5.1.2-1中使用GIMP 2.2.8制作图片时是这样

网址:
PNG图像的颜色类型存储在文件的字节偏移量25处(从0开始计数)。因此,如果您可以获得PNG文件的实际字节,只需查看字节25(我不做PHP,所以我不知道如何做):

  • 0-灰度
  • 2-RGB
  • 3-带调色板的RGB
  • 4-灰度+α
  • 6-RGB+α
前面的字节(偏移量24)给出每个通道的位数。有关更多详细信息,请参阅


稍微改变一下,一个PNG文件可能有一个tRNS块(当它是颜色类型0 2或3时)就有“1位alpha”(如GIF)。

我今天登陆这里,寻找一种方法(通过php)来判断一个特定的.PNG图像是否是alpha-PNG-
David Jones的回答指向了正确的方向,非常容易在php中实现:

文件\u获取内容只加载25'字节(确实如此!),并且
ord()获取其ASCII值,并对其进行测试(在我的例子中是针对“6”)

实际上,我需要它来确保与ie6的向后兼容性 在cms用户生成的页面中,要用内联块替换所有alpha png标记,alpha png文件将作为ms专有css属性过滤器的变量

…一切都很好,谢谢


保罗

你说的扭曲是什么意思?您需要采取某些步骤来保持alpha透明度。但是灰度问题。。。这对meI来说是新的,我更新了我的示例以包含示例图像。保持alpha透明度很好。GD无法处理的是具有透明度的灰度图像,请参见下面的haim evgi的回答。谢谢,但是,在尝试使用
imagecreatefrompng()
创建资源之前,我正在寻找一种检测图像是否具有透明度的灰度图像的方法。这些图像被提交到网站,因此很遗憾,我无法将图像重新保存为RBG(至少我不知道有什么方法)。使用
(bool)(ord(file\u get\u contents($alpha\u png\u candidate,NULL,NULL,25,1))&4)
将告诉您是否存在alpha通道,无论图像是灰度还是rgb。
<?php

$resource = imagecreatefrompng('./Robin.png');
header('Content-type: image/png');
imagepng($resource);
imagedestroy($resource);
if(ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) == 6) {
  is_alpha_png_so_do_something();
  }
.alpha_png_span{
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop')
  }