【问题标题】:How can I merge 3 images into 1 image via PHP?如何通过 PHP 将 3 张图像合并为 1 张图像?
【发布时间】:2011-05-24 02:14:21
【问题描述】:

我真的找不到成功的方法。我已经在谷歌上搜索了这个,它要么在图像周围有黑色阴影,要么所有图像都没有重叠。你能帮忙吗?

我对 PHP 很好;我会给自己一个 2/5.. 如果有人愿意帮助我,我将不胜感激。

我正在寻找一个简单的 api,类似于:

$color=$_GET['color'];
$face=$_GET['face'];
$hat=$_GET['hat'];

echo '<img src="avatar.php?color=$color&face=$face&hat=$hat">';

提前感谢您的帮助。我也可以通过我对其他语言的了解来理解 php,所以不要害怕与我谈论技术;但不是太技术性。

【问题讨论】:

  • 你的简单api应该做什么?如果三个图像具有不同的尺寸怎么办?您可能会使用gdImageMagick PHP 扩展。
  • Nono,所有图片都是 58x75。
  • 你想对这些图像做什么? “合并”是一个相当宽泛的术语,不够具体。
  • 所有图片都是透明的,位置相同,大小相同。
  • 所以你把你的三张图片(带有 alpha 通道?),覆盖它们,结果又是一张 58x75 的图片?

标签: php image merge gd


【解决方案1】:

这个答案有很多 cmets,所以我将其发布为答案。

让它在我的电脑上运行。

使用 svens 代码:

    $images = array( $_GET['color'], $_GET['face'], $_GET['hat'] );

    // Allocate new image
    $img = imagecreatetruecolor(58, 75);
    // Make alpha channels work
    imagealphablending($img, true);
    imagesavealpha($img, true);

    foreach($images as $fn) {
        // Load image
        $cur = imagecreatefrompng($fn);
        imagealphablending($cur, true);
        imagesavealpha($cur, true);

        // Copy over image
        imagecopy($img, $cur, 0, 0, 0, 0, 58, 75);

        // Free memory
        imagedestroy($cur);
    }   

    header('Content-Type: image/png');  // Comment out this line to see PHP errors
    imagepng($img);

?>

我这样重命名了你的图片,这样更容易:


微笑:a.png
耳机:b.png
蓝色:c.png

原来问题在于它的分层。把一个放在另一个后面

重命名图像后,使用此网址——它会起作用(在我的电脑上工作)。

YOUR_FILE.php?hat=b.png&color=c.png&face=a.png

这仍然会给你一个黑色的背景。我不确定您在服务器上的文件中是否有与上述完全相同的代码 - 因为我在您的链接上使用了图像顺序,但它没有帮助。尝试将完全相同的代码复制粘贴到不同的文件上,然后尝试。玩弄订单并检查结果。

【讨论】:

  • 感谢您的帮助,但图像似乎已损坏..您认为您知道出了什么问题吗?
  • 天哪..它只是随机开始工作..好吧,它仍然有黑色背景。 ://
【解决方案2】:

这里有一些代码可以帮助您入门。但是您应该注意,使用 gd 和 alpha 通道进行图像处理是巫术。

<?php

    $images = array( $_GET['color'], $_GET['face'], $_GET['hat'] );

    // Allocate new image
    $img = imagecreatetruecolor(58, 75);
    // Make alpha channels work
    imagealphablending($img, true);
    imagesavealpha($img, true);

    foreach($images as $fn) {
        // Load image
        $cur = imagecreatefrompng($fn);
        imagealphablending($cur, true);
        imagesavealpha($cur, true);

        // Copy over image
        imagecopy($img, $cur, 0, 0, 0, 0, 58, 75);

        // Free memory
        imagedestroy($cur);
    }   

    header('Content-Type: image/png');  // Comment out this line to see PHP errors
    imagepng($img);

?>

您现在还需要做的是检查返回值(查看手册中的 image* 函数)以确保它不会静默失败。

我真的不能保证它会与 alpha 通道一起工作。如果不是,你可能不得不通过 cmets 到 php.net 上的 imagecopymerge()imagecopy() 看看我是否遗漏了什么.

【讨论】:

  • 是的,谢谢,但它显示了损坏的图像。 :/ 我再去谷歌看看。
  • 注释掉标题,你可能会知道更多。大声笑等等,我应该发现一个错误。现已修复。
  • 好吧,我注释掉了那一行,得到不少解析错误..调试时间。
  • 警告:imagecopymerge():提供的参数不是 /home/vol7/xtreemhost.com/xth_6884492/htdocs/avatar.php 中第 18 行的有效图像资源警告:imagepng():提供的参数不是第 25 行 /home/vol7/xtreemhost.com/xth_6884492/htdocs/avatar.php 中的有效图像资源
  • 好的,现在可以了。但是,它显示黑色背景,我不确定是否显示“颜色”。
猜你喜欢
  • 2012-03-04
  • 2015-07-17
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
相关资源
最近更新 更多