How to check a PNG for grayscale/alpha color type?

一曲冷凌霜 提交于 2019-12-01 01:15:39

问题


PHP and GD seem to have trouble creating images from PNGs of type greyscale with alpha when using imagecreatefrompng(). The results are incredibly distorted.

I was wondering if anyone knew of a way to test for the colour type in order to notify the user of the incompatibility?

Example:

Original Image: http://dl.dropbox.com/u/246391/Robin.png
Resulting Image: http://dl.dropbox.com/u/246391/Robin_result.png

Code:

<?php

$resource = imagecreatefrompng('./Robin.png');
header('Content-type: image/png');
imagepng($resource);
imagedestroy($resource);

Cheers,

Aron


回答1:


The colour type of a PNG image is stored at byte offset 25 in the file (counting from 0). So if you can get hold of the actual bytes of the PNG file, simply look at byte 25 (I don't do PHP, so I don't know how to do that):

  • 0 - greyscale
  • 2 - RGB
  • 3 - RGB with palette
  • 4 - greyscale + alpha
  • 6 - RGB + alpha

The preceding byte (offset 24) gives the number of bits per channel. See the PNG spec for more details.

In a slight twist a PNG file may have "1-bit alpha" (like GIFs) by having a tRNS chunk (when it is colour type 0 2 or 3).




回答2:


i landed here today searching for a way to tell (via php) if a specific .png image is an alpha-png one -
David Jones' answer points to the right direction, really easy to implement in php:

file_get_contents to load just that 25' byte (there it is, indeed!), and
ord() to get its ASCII value, to test it (against '6' in my case)

if(ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) == 6) {
  is_alpha_png_so_do_something();
  }

actually i needed that for assuring backward compatibility with ie6 within cms-user-generated-pages, to replace all alpha-png < img > tags with inline-block < spans > - the alpha-png file will then be served as variable for the ms-proprietary css property filter

.alpha_png_span{
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop')
  }

...and it all works, so thanks!

paolo




回答3:


see this answer :

Another usefull note for those using ImageCreateFromPng: PHP and GD do not recognize grayscale/alpha images.

So if you use grayscale images with transparency between 0% and 100%, then save the image as RGB.

At least this is true for PHP Version 4.4.2-1 and in 5.1.2-1 with pictures made with GIMP 2.2.8.

url : http://php.net/manual/en/function.imagecreatefrompng.php



来源:https://stackoverflow.com/questions/2057923/how-to-check-a-png-for-grayscale-alpha-color-type

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!