2010-01-13 2 views
7

imagecreatefrompng()을 사용하는 경우 PHP 및 GD에서 alpha를 사용하는 greyscale 유형의 PNG 이미지를 만드는 데 문제가있는 것 같습니다. 결과는 엄청나게 왜곡됩니다.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

왜곡 된 것은 무엇입니까? 알파 투명도를 유지하기 위해 취할 수있는 특정 단계가 있습니다. 그레이 스케일 문제 ... 저에게 새로운 것 –

+0

예제 이미지를 포함하도록 예제를 업데이트했습니다. 알파 투명도를 유지하는 것이 좋습니다. 이것은 GD가 처리 할 수없는 투명도가있는 그레이 스케일 이미지입니다 (아래 haim evgi의 답변 참조). – ac94

답변

8

PNG 이미지의 색상 종류가 바이트에 저장된다 (0부터 카운트) 파일 (25)의 오프셋. 당신은 PNG 파일의 실제 바이트의 보류를 얻을 수 있도록하면, 간단하게 (내가 PHP를하지 않는다, 그래서 그렇게하는 방법을 모른다) 바이트 (25)를 보면 :

  • 0 - 그레이 스케일
  • 2 - RGB
  • 3 - RGB 팔레트
  • 4 - 스케일 + 알파
  • 6 - RGB + 알파
  • 앞에 나온 바이트 (24 오프셋) 채널당 비트의 개수를 제공

. 자세한 내용은 the PNG spec을 참조하십시오.

PNG 파일은 tRNS 청크 (색상 유형 0 2 또는 3 인 경우)를 사용하여 "1 비트 알파"(GIF와 같은)를 가질 수 있습니다.

+0

완벽합니다. 고마워요! – ac94

0

이 대답을 참조하십시오 :

ImageCreateFromPng를 사용하는 사람들에게 유용한 또 다른 참고 사항 : PHP와 GD는 그레이 스케일/알파 이미지를 인식하지 못합니다.

투명도가 0 %에서 100 % 사이 인 회색조 이미지를 사용하는 경우 이미지를 RGB로 저장하십시오.

적어도 김프 2.2.8을 사용하여 만든 사진은 PHP 버전 4.4.2-1 및 5.1.2-1에 해당됩니다.

은 URL : http://php.net/manual/en/function.imagecreatefrompng.php

+0

고마워요,하지만 이미지가'imagecreatefrompng()'로 리소스를 만들기 전에 투명도를 가진 그레이 스케일임을 감지하는 방법을 찾고 있습니다. 이미지가 사이트에 제출되므로 불행히도 이미지를 RBG로 다시 저장할 방법이 없습니다 (적어도 메소드를 인식하지 못함). – ac94

4

저는 오늘 (PHP를 통해) 특정 .png 이미지가 알파 -png인지 알려주는 방법을 찾고 있습니다.
David Jones의 대답은 올바른 방향으로 향하고 있으며 PHP에서 구현하기 쉽습니다.

file_get_contents 단지 25 분의 1 바이트를로드해야합니다 (실제로는!) 및
ORD()를 자사의 ASCII 값을 얻기 위해, (

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

는 사실은 내가 필요) 내 경우에는 '6'에 대해 그것을 테스트하는 CMS 사용자 내에서 6으로 과의 호환성을 보장하기위한 -generated-페이지, 인라인 블록과 모든 알파 PNG < IMG> 태그를를 대체하는 < 스팬> - 알파 - PNG 파일은 다음 MS-독점 CSS 속성 필터에 대한 변수로 제공됩니다

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

... 모든 것이 작동하므로 감사합니다!

파올로

+0

'(bool) (ord (file_get_contents ($ alpha_png_candidate, NULL, NULL, 25, 1)) & 4)'대신 이미지가 회색조인지 rgb인지에 관계없이 알파 채널이 있는지를 알려줍니다. – Walf

관련 문제