gpt4 book ai didi

关于旋转和合并的 PHP 图像质量问题

转载 作者:搜寻专家 更新时间:2023-10-31 21:17:47 24 4
gpt4 key购买 nike

当我合并两张图片作为背景,另一张作为目标图片时。我正在使用 png。当我旋转目标图像然后合并时,是的,一切都很好,除了旋转图像的边缘变成锯齿形,我的意思是不平滑。如何使用 php GD 使边缘平滑???

Normal Image

After Rotation

我使用的代码:

<?php

// Create image instances

$dest = imagecreatefrompng('bg.png');
$src = imagecreatefrompng('text.png');
$width = imagesx($src);
$height = imagesy($src);
imageantialias($src, true);
$color = imagecolorallocatealpha($src, 0, 0, 0, 127);
$rotated = imagerotate($src, 40, $color);
imagesavealpha($rotated, true);

// $trans_colour = imagecolorallocatealpha($rotated, 0, 0, 0, 127);
// imagefill($rotated, 0, 0, $trans_colour);

imagepng($rotated, 'shahid.png');
$new_img = imagecreatefrompng('shahid.png?');
$width = imagesx($new_img);
$height = imagesy($new_img);

// imagecopymerge($dest, $new_img, 50, 50, 0, 0, $width+60, $height+60, 100);

imagecopymerge_alpha($dest, $new_img, 0, 20, 0, 0, $width, $height, 100);

// Output and free from memory

header('Content-Type: image/png');
imagepng($dest);
imagedestroy($dest);
imagedestroy($src);

function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
{
if (!isset($pct)) {
return false;
}

$pct/= 100;

// Get image width and height

$w = imagesx($src_im);
$h = imagesy($src_im);

// Turn alpha blending off

imagealphablending($src_im, false);

// Find the most opaque pixel in the image (the one with the smallest alpha value)

$minalpha = 127;
for ($x = 0; $x < $w; $x++)
for ($y = 0; $y < $h; $y++) {
$alpha = (imagecolorat($src_im, $x, $y) >> 24) & 0xFF;
if ($alpha < $minalpha) {
$minalpha = $alpha;
}
}

// loop through image pixels and modify alpha for each

for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {

// get current alpha value (represents the TANSPARENCY!)

$colorxy = imagecolorat($src_im, $x, $y);
$alpha = ($colorxy >> 24) & 0xFF;

// calculate new alpha

if ($minalpha !== 127) {
$alpha = 127 + 127 * $pct * ($alpha - 127) / (127 - $minalpha);
}
else {
$alpha+= 127 * $pct;
}

// get the color index with new alpha

$alphacolorxy = imagecolorallocatealpha($src_im, ($colorxy >> 16) & 0xFF, ($colorxy >> 8) & 0xFF, $colorxy & 0xFF, $alpha);

// set pixel with the new color + opacity

if (!imagesetpixel($src_im, $x, $y, $alphacolorxy)) {
return false;
}
}
}

// The image copy

imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
}

?>

最佳答案

我在一个旧项目中有这个并且为我工作。无论如何,我不记得我的 png 是否真的具有 alpha 透明度或“gif”透明度......

$image = imagecreatefrompng($href);
$newImage = imagecreatefrompng($href2);
imagealphablending($image, true);
imagealphablending($newImage, true);
$newImage = imagerotate($newImage, $r, -1);
$blue = imagecolorallocate($newImage, 0, 0,255);
imagecolortransparent($newImage, $blue);
imagecopy($image,$newImage,$x,$y,0,0,imagesx($newImage) , imagesy($newImage));

根据手册,在这种情况下,imagealphablending 应该替换为 imagesavealpha

关于关于旋转和合并的 PHP 图像质量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com