php 多張圖片合併解決png黑背景問題
阿新 • • 發佈:2019-01-22
PHP imagecopymerge 函式可以支援兩個影象疊加時,設定疊加的透明度,imagecopy 函式則不支援疊加透明,實際上,PHP內部原始碼裡,imagecopymerge在透明度引數為100時,直接呼叫imagecopy函式。
然而,imagecopy函式拷貝時可以保留png影象的原透明資訊,而imagecopymerge卻不支援圖片的本身的透明拷貝,
比較羅嗦,以一個實際的例子來演示以下:
在影象上打上LOGO水印。
一般來說,logo由圖示和網址組成,比如是一個透明的png影象,logo.png ,
現在如果要把這個logo打到圖片上,
使用imagecopymerge函式,可以實現打上透明度為30%的淡淡的水印圖示,但logo本身的png就會變得像IE6不支援png透明那樣,背景不透明瞭,如果使用imagecopy函式,可以保留logo本身的透明資訊,但無法實現30%的淡淡水印疊加,
php官方有人實現的辦法:使用 imagecopymerge_alpha 函式可以直接實現這個兩個函式的功能,保留png自身透明的同時,實現自定義透明度疊加,不過該函式的內部使用 $opacity = 100 - $opacity; 來實現透明度,好像剛好反了
$opacity=$pct;
// getting the watermark width
$w = imagesx($src_im);
// getting the watermark height
$h = imagesy($src_im);
// creating a cut resource
$cut = imagecreatetruecolor($src_w, $src_h);
// copying that section of the background to the cut
imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);
// inverting the opacity
$opacity = 100 - $opacity;
// placing the watermark now
imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);
imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity);
}
然而,imagecopy函式拷貝時可以保留png影象的原透明資訊,而imagecopymerge卻不支援圖片的本身的透明拷貝,
比較羅嗦,以一個實際的例子來演示以下:
在影象上打上LOGO水印。
一般來說,logo由圖示和網址組成,比如是一個透明的png影象,logo.png ,
現在如果要把這個logo打到圖片上,
使用imagecopymerge函式,可以實現打上透明度為30%的淡淡的水印圖示,但logo本身的png就會變得像IE6不支援png透明那樣,背景不透明瞭,如果使用imagecopy函式,可以保留logo本身的透明資訊,但無法實現30%的淡淡水印疊加,
php官方有人實現的辦法:使用 imagecopymerge_alpha 函式可以直接實現這個兩個函式的功能,保留png自身透明的同時,實現自定義透明度疊加,不過該函式的內部使用 $opacity = 100 - $opacity; 來實現透明度,好像剛好反了
$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = imagecreatefromstring(file_get_contents($src_path));
imagecopy($dst, $src, 100, 100, 0, 0, 100, 100);//完成合並
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){$opacity=$pct;
// getting the watermark width
$w = imagesx($src_im);
// getting the watermark height
$h = imagesy($src_im);
// creating a cut resource
$cut = imagecreatetruecolor($src_w, $src_h);
// copying that section of the background to the cut
imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);
// inverting the opacity
$opacity = 100 - $opacity;
// placing the watermark now
imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);
imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity);
}