Pixel per Pixel image, прозрачный превращается в черный - PullRequest
1 голос
/ 18 декабря 2010

Я прочитал кое-что об этом, но я не могу понять, как вставить это в мой код.

Вот оно:

function go($image) {
    // Open the image
    $getimage=imagecreatefrompng($image);
  //Get the width/height
   $w = imagesx($getimage);
   $h = imagesy($getimage);
   //init Count variable, when it reach the width, skip a line
   $count = 0;
   // For each line
   for($y=0;$y<$h;$y++) {
       // For each column
      for($x=0;$x<$w;$x++) {
        $rgba     = imagecolorat($getimage, $x, $y);
        $r = ($rgba >> 16) & 0xFF;
        $g = ($rgba >> 8) & 0xFF;
        $b = $rgba & 0xFF;
        $a     = ($rgba & 0x7F000000) >> 24;
        echo '<div class="pix" style="background-color: rgba('.$r.', '.$g.', '.$b.', '.$a.');"></div>';
        $count++;
        if($count==$w) {echo '<br>'; $count = 0; }

      }
   }
   echo $pixel_gen;

}

Если вы хотите увидетькак это выглядит, нажмите здесь: http://narks.xtreemhost.com/

И дважды щелкните любой значок, появится всплывающее окно.(Примечание: при двойном щелчке на любом значке будет отображаться одно и то же изображение (я еще не исправил это)

Есть идеи, как сделать так, чтобы черный пиксель выглядел как настоящий пиксель с альфа-каналом)?

Спасибо за вашу помощь!

РЕДАКТИРОВАНИЕ (Новый код, я ставлю только первые строки, так как хочу сэкономить место)

function go($image) {
    // Open the image
    $getimage=imagecreatefrompng($image);
    imagealphablending($getimage, false);
    imagesavealpha($getimage, true);

  //Get the width/height
   $w = imagesx($getimage);
   $h = imagesy($getimage);
[...]

Чтобы посмотреть, как это выглядиткак сейчас, посетите веб-сайт выше и дважды щелкните значок.

РЕДАКТИРОВАТЬ 2 Я только что попробовал (для теста) с:

$getimage=imagecreatefrompng('iconDB/lib/chat_fav_48.png');
imagealphablending($getimage, false);
imagesavealpha($getimage, true);

header("Content-type: image/png");
imagepng($getimage);
imagedestroy($getimage);

, а затемс

$getimage=imagecreatefrompng('iconDB/lib/chat_fav_48.png');

header("Content-type: image/png");
imagepng($getimage);
imagedestroy($getimage);

Первый в порядке, а второй делает пиксели черными.Так бывает, когда я получаю цвета RGB каждого пикселя и когда я его отображаю.Кто-нибудь видит там ошибку?

Ответы [ 2 ]

2 голосов
/ 21 декабря 2010

Вот правильный рабочий код, чтобы завершить этот вопрос.

function go($image) {
 // Open the image
 $getimage=imagecreatefrompng($image);
 imagealphablending($getimage, true);
 imagesavealpha($getimage, true);

  //Get the width/height
   $w = imagesx($getimage);
   $h = imagesy($getimage);
   //init Count variable, when it reach the width, skip a line
   $count = 0;
   // For each line
   for($y=0;$y<$h;$y++) {
    // For each column
      for($x=0;$x<$w;$x++) {
    // Get the image color for this pixel
  $rgba     = imagecolorat($getimage, $x, $y);
  $r = ($rgba >> 16) & 0xFF;
  $g = ($rgba >> 8) & 0xFF;
  $b = $rgba & 0xFF;
  $a = ($rgba & 0x7F000000) >> 24;
  //Calculating the correct Alpha value for rgba display in css
  $a = (127-$a)/127;
  echo '<div class="pix" style="background-color: rgba('.$r.', '.$g.', '.$b.', '.$a.');"></div>';
  $count++;
  if($count==$w) {echo '<br>'; $count = 0; }

      }
   }
   echo $pixel_gen;

}

Надеюсь это кому-нибудь пригодится

1 голос
/ 18 декабря 2010

Согласно комментариям на странице imagecreatefrompng , вам необходимо позвонить imagealphablending и imagesavealpha

imagealphablending($getimage, false);
imagesavealpha($getimage, true);

Есть и другие комментарииоб альфа-прозрачности и PNG на этой странице.

...