PHP PNG: прозрачность преобразуется в видимый цвет.Как этого избежать? - PullRequest
1 голос
/ 12 января 2012

Когда я пытаюсь преобразовать png -> png с изменением размера, прозрачность представляется в виде конкретного цвета: # ff00ff ;

Вот результат:

http://i.stack.imgur.com/1xTd5.pngВот код:

<?php

$image  = __DIR__ . '/image/data/10891.png'; // local file
$image  = 'http://content.wuala.com/contents/mike.walker/sharing/10891.png?dl=1'; // source file in public
$scale  = 1;

// Get meta for image
$info = getimagesize($image);
$info = array(
    'width'  => $info[ 0 ],
    'height' => $info[ 1 ],
    'bits'   => $info[ 'bits' ],
    'mime'   => $info[ 'mime' ]
);

// Get res for image
$image = imagecreatefrompng($image);

$width = $info['width'] * $scale;
$height = $info['height'] * $scale;

$new_width  = (int)($info[ 'width' ] * $scale);
$new_height = (int)($info[ 'height' ] * $scale);
$xpos       = (int)(($width - $new_width) / 2);
$ypos       = (int)(($height - $new_height) / 2);

$image_old = $image;
$image     = imagecreatetruecolor($width, $height);

//imagetruecolortopalette($image, FALSE, 255);
imagealphablending($image, false);
imagesavealpha($image, true);
$background = imagecolorallocatealpha($image, 255, 255, 255, 128);
imagecolortransparent($image, $background);

imagefilledrectangle($image, 0, 0, $width, $height, $background);
imagecopyresampled($image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $info[ 'width' ], $info[ 'height' ]);

header('Content-type: image/png');
imagepng($image);

Как решить эту проблему?Рад получить любую помощь.Спасибо.

PS Извините за мой английский.

1 Ответ

0 голосов
/ 18 января 2012

После попытки и попытки это решение: imagecopymerge () Объясните мне кого-нибудь, почему?

<?php

$image  = 'http://content.wuala.com/contents/mike.walker/sharing/10891.png?dl=1';

// ---------------------------------------- Prepare

$scale = 1;

// Get meta for image
$info = getimagesize($image);
$info = array(
    'width'  => $info[ 0 ],
    'height' => $info[ 1 ],
    'bits'   => $info[ 'bits' ],
    'mime'   => $info[ 'mime' ]
);

// Get res for image
$image = imagecreatefrompng($image);

$width  = $info[ 'width' ] * $scale;
$height = $info[ 'height' ] * $scale;

$new_width  = (int)($info[ 'width' ] * $scale);
$new_height = (int)($info[ 'height' ] * $scale);
$xpos       = (int)(($width - $new_width) / 2);
$ypos       = (int)(($height - $new_height) / 2);

$image_old = $image;
$image     = imagecreatetruecolor($width, $height);
$image2     = imagecreatetruecolor($width, $height);

//imagetruecolortopalette($image, FALSE, 255);
imagealphablending($image, true);
imagesavealpha($image, true);
$background = imagecolorallocatealpha($image, 255, 255, 255, 0);
//$background = imagecolortransparent($image, imagecolorexact($image, 254, 0, 254));
//$background = imagecolorallocate($image, 254, 0, 3);
imagecolortransparent($image2, $background);

imagefilledrectangle($image, 0, 0, $width, $height, $background);
//imagefilledrectangle($image2, 0, 0, $width, $height, $background);
imagecopymerge($image, $image_old, 0, 0, 0, 0, $new_width, $new_height, 100);
imagecopyresampled($image2, $image, $xpos, $ypos, 0, 0, $new_width, $new_height, $info[ 'width' ], $info[ 'height' ]);
//imagecopyresampled($image2, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $info[ 'width' ], $info[ 'height' ]);

// ------------------------------------------------ Convert

$scale = .9;

$width  = $info[ 'width' ] * $scale;
$height = $info[ 'height' ] * $scale;

$new_width  = (int)($info[ 'width' ] * $scale);
$new_height = (int)($info[ 'height' ] * $scale);
$xpos       = (int)(($width - $new_width) / 2);
$ypos       = (int)(($height - $new_height) / 2);

$image_old = $image2;
$image     = imagecreatetruecolor($width, $height);

//imagetruecolortopalette($image, FALSE, 255);
imagealphablending($image, true);
imagesavealpha($image, true);
$background = imagecolorallocatealpha($image, 255, 0, 255, 0);
//$background = imagecolortransparent($image, imagecolorexact($image, 254, 0, 254));
//$background = imagecolorallocate($image, 254, 0, 3);
imagecolortransparent($image2, $background);

//imagefilledrectangle($image2, 0, 0, $width, $height, $background);
//imagefilledrectangle($image2, 0, 0, $width, $height, $background);
//imagecopymerge($image, $image_old, 0, 0, 0, 0, $new_width, $new_height, 100);
//imagecopyresampled($image2, $image, $xpos, $ypos, 0, 0, $new_width, $new_height, $info[ 'width' ], $info[ 'height' ]);
imagecopyresampled($image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $info[ 'width' ], $info[ 'height' ]);

header('Content-type: image/png');
imagepng($image);
//imagepng($image2, __DIR__ . '/resized.png');
...