WideImage - 转换PNG的透明区域应为白色

时间:2012-08-15 07:47:34

标签: php image

每当用户使用我的脚本上传照片时,WideImage会将其转换为JPEG。但是,我只是注意到,如果我上传一张带有透明背景的PNG图片,它会变成黑色。

有没有办法让这个白色呢?

这是我保存图片的方式:

$img->resizeDown('500', null)->saveToFile('annonce_billeder/'.$bnavn.'.jpeg', 70);

4 个答案:

答案 0 :(得分:1)

不是直接的。您想了解透明度如何存储在图片中:它是一个普通的颜色值(任何颜色),特别标记为透明。

因此,您尝试实际的示例图片中指定的颜色很可能编码为黑色,并且转换时透明度会丢失。

您可能会尝试查看是否可以检测到传入图片中是否有标记为透明的颜色,然后在转换图片之前手动将该颜色更改为非透明和白色。

答案 1 :(得分:1)

可能类似,但我可以创建一个空的真彩色图像,并在进行任何绘图之前用自己的透明颜色填充它:

$img = WideImage_TrueColorImage::create(100, 100);
$img->fill(0,0,$img->getTransparentColor());
// then text, watermark, etc
$img->save('...');

我假设你会做更多的事情:

$img = WideImage::load(<source>);
if( <$img is png> ) {
   $img->fill(0,0, $img->getTransparentColor());
}
$img->resizeDown(500, null)->saveToFile('target.jpg', 70);

答案 2 :(得分:1)

这是怎么做的:

// Load the original image
$original = WideImage::load("image.png");
$original->resizeDown(1000); // Do whatever resize or crop you need to do

// Create an empty canvas with the original image sizes
$img = WideImage::createTrueColorImage($resized->getWidth(),$resized->getHeight());
$bg = $img->allocateColor(255,255,255);
$img->fill(0,0,$bg);

// Finally merge and do whatever you need...
$img->merge($original)->saveToFile("image.jpg");

答案 3 :(得分:1)

对Ricardo Gamba的解决方案代码进行一些更改(更正)后,它就完成了工作......

// Load the original image
$original = WideImage::load("image.png");
$resized  = $original->resizeDown('500', null); // Do whatever resize or crop you need to do
$original->destroy(); // free some memory (original image not needed any more)

// Create an empty canvas with the resized image sizes
$img = WideImage::createTrueColorImage($resized->getWidth(), $resized->getHeight());
$bg  = $img->allocateColor(255,255,255);
$img->fill(0,0,$bg);

// Finally merge and do whatever you need...
$img->merge($resized)->saveToFile("image.jpg", 70);