2010-01-13 36 views
7

當使用imagecreatefrompng()時,PHP和GD似乎無法從使用alpha的灰度類型的PNG創建圖像。結果令人難以置信地扭曲。如何檢查灰度/ alpha顏色類型的PNG?

我想知道是否有人知道一種方法來測試顏色類型以便通知用戶不兼容性?

實施例:

原始圖像:http://dl.dropbox.com/u/246391/Robin.png
得到的圖像:http://dl.dropbox.com/u/246391/Robin_result.png

代碼:

<?php 

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

乾杯,

阿隆

+0

你是什麼意思扭曲? 您需要採取某些步驟來保留Alpha透明度。 但灰度問題......對我而言是新的 – 2010-01-13 15:45:37

+0

我已更新我的示例以包含示例圖像。保持alpha透明度是好的。這是GD無法處理的具有透明度的特定灰度圖像,請參閱下面的haim evgi的答案。 – ac94 2010-01-13 16:54:04

回答

8

PNG圖像的顏色類型被存儲在字節在文件中的偏移25(從0開始計數)。所以,如果你能得到的PNG文件的實際字節的保持,單純看25個字節(我不這樣做PHP的,所以我不知道該怎麼做):

  • 0 - 灰度
  • 2 - RGB
  • 3 - RGB調色板
  • 4 - 灰度+阿爾法
  • 6 - RGB +阿爾法

的前面的字節(偏移24)給出了每個信道的比特數。有關更多詳細信息,請參閱the PNG spec

在輕微扭曲的情況下,PNG文件可能具有「1位alpha」(如GIF),因爲它具有tRNS塊(當它是顏色類型0 2或3時)。

+0

非常完美,謝謝! – ac94 2010-02-05 11:45:31

0

看到這個答案 :

對於那些使用ImageCreateFromPng的另一個有用說明: PHP和GD不識別灰度/ alpha圖像。

因此,如果您使用透明度在0%和100%之間的灰度圖像,則將圖像保存爲RGB。

至少對於PHP版本4.4.2-1和5.1.2-1來說這是正確的,圖片是用GIMP 2.2.8製作的。

網址: http://php.net/manual/en/function.imagecreatefrompng.php

+0

謝謝,但是我試圖用'imagecreatefrompng()'創建資源之前,正在尋找一種檢測圖像灰度和透明度的方法。 圖像被提交到網站,所以很遺憾我沒有辦法將圖像重新保存爲RBG(至少我不知道方法)。 – ac94 2010-01-13 16:43:17

4

我今天在這裏降落尋找一種方式來告訴(通過PHP)如果特定的PNG圖片爲α-png格式一個 -
大衛瓊斯的答案指向正確的方向,很容易在PHP來實現:

file_get_contents加載只有25'字節(這的確是!),以及
ORD()以獲得其ASCII值,測試它(在我的情況對「6」)

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

其實我需要的是爲保證與IE6 向後兼容性CMS用戶中 - 生成的頁面,全部更換字母PNG < img>標籤inline-block的<跨度> - 那麼阿爾法PNG文件將擔任變量爲MS-專有的CSS屬性過濾

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

...這一切工作,所以謝謝!

paolo

+0

使用'(bool)(ord(file_get_contents($ alpha_png_candidate,NULL,NULL,25,1))&4)'而不管圖像是灰度還是rgb,都會告訴你是否有alpha通道。 – Walf 2014-03-21 02:46:01