每当用户使用我的脚本上传照片时,WideImage 都会将其转换为 JPEG。但是,我刚刚注意到,如果我上传一张带有透明背景的 PNG 图片,它会变成黑色。
有没有办法让这个变白呢?
这就是我保存图像的方式:
$img->resizeDown('500', null)->saveToFile('annonce_billeder/'.$bnavn.'.jpeg', 70);
不是很直接。您不需要了解透明度是如何存储在图片中的:它是一个普通的颜色值(任何颜色),已被特别标记为透明。
因此,您尝试的示例图片中指定的颜色很可能实际上被编码为黑色,并且在转换时透明度会丢失。
您可能会尝试找出是否可以检测传入图片中是否有标记为透明的颜色,然后在转换图片之前手动将该颜色更改为非透明和白色。
可能类似,但我能够创建一个空的真彩色图像并在进行任何绘图之前用它自己的透明颜色填充它:
$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);
这是如何做到的:
// 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");
通过对 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);