Imagemagick 旋转透明图像上不需要的黑色背景

Posted

技术标签:

【中文标题】Imagemagick 旋转透明图像上不需要的黑色背景【英文标题】:Imagemagick unwanted black background on rotated transparent images 【发布时间】:2012-02-14 12:36:50 【问题描述】:

我有一个网站,可以生成以不同角度堆叠在一起的类似宝丽来的图像。 到目前为止一切正常,但现在我的透明 .png 周围开始出现黑色背景。 你可以看到问题here。上一张相册里的图都乱了。

我正在使用 imagemagick (6.5.4.7-3.fc12)。

我的命令看起来像这样: 第一个包含在 foreach 中并生成一堆以不同角度旋转的 pngconvert '$sf' -auto-orient -thumbnail 120x120 -gravity center -bordercolor snow -background black -polaroid $angle $i.png

第二个命令获取先前生成的图像并将它们堆叠在一起convert '*.png' -background transparent -alpha on -gravity center -layers merge -extent 190x190 +repage -thumbnail 115x115 -gravity center -extent 120x120 'result.png'

就我的调试而言,黑色背景已经存在于使用第一个命令生成的图像中,并且它们仅在我旋转图像时出现。如果我只使用-polaroid 0 而不是+polaroid,那么生成的图像就可以了。 我的猜测是问题不在于代码本身,而在于 ImageMagick 或其他东西在我的服务器上升级了,这导致了整个混乱。

我还尝试了各种设置 -alpha 的组合以及我在 imagemagick 文档中可以找到的所有其他内容,这些组合甚至与透明度略有相关,但似乎没有任何效果。

【问题讨论】:

【参考方案1】:

经过各种测试,我终于得出结论,问题不在于我的convert 命令。

我的问题的解决方案是重新安装/更新 ImageMagick。

【讨论】:

【参考方案2】:

//去除不需要的黑/白背景,使其成为透明背景。

            ImageInfo info1 = new ImageInfo(
            "/opt/apache-tomcat-6.0.18/webapps/newcpclient_branch/upload/sample/ATT00003.jpg");
    MagickImage blankImage = new MagickImage(info1);

    **blankImage.setBackgroundColor(PixelPacket.queryColorDatabase("#FFFF8800"));**

    blankImage = blankImage.rotateImage(250.0);
    blankImage.setFileName("/opt/apache-tomcat-6.0.18/webapps/newcpclient_branch/upload/sample/transparent.png");
    blankImage.writeImage(info1);

【讨论】:

【参考方案3】:

您在第一行中将 -background 设置为“黑色”。这意味着您不会获得透明度。如果你把它设置为'none',它会起作用吗?

编辑:

import os
import random as ra

for i in range(10):
    image = 'convert C:/image.png -auto-orient -thumbnail 120x120 -gravity center -bordercolor snow -background none -polaroid '+str(ra.uniform(0,360))+' C:/test/image_polaroid_'+str(i)+'.png'
    os.system(image)

image = 'convert -size 500x500 xc:transparent C:/test/result.png'
os.system(image)

for i in range(10):
    image = 'composite -gravity center C:/test/image_polaroid_'+str(i)+'.png C:/test/result.png C:/test/result.png'
    os.system(image)

编辑 2:

import os
import random as ra

for i in range(10):
    image = 'convert C:/image.png -background none -polaroid 0 C:/test/image_polaroid_'+str(i)+'.png'
    os.system(image)
    image = 'mogrify -rotate '+str(ra.randint(0,360))+' -background none C:/test/image_polaroid_'+str(i)+'.png'
    os.system(image)

【讨论】:

背景(据我所知)是为宝丽来阴影设置的……但我已经尝试将其设置为“无”和“透明”以确保得到相同的结果。我所做的任何更改似乎都对其没有任何影响。 @JoeBlack 如果您在第一行添加“-alpha on”,它也不起作用? '-alpha on' 也无济于事,'-alpha set' 也无济于事,就像其他 -alpha 设置都没有一样(已经全部尝试过)。 @JoeBlack 你能帮我一个忙,试试我编辑的答案中的代码,看看这是否适合你?它适用于 python,因此您必须对其进行一些调整。 好的,经过一番思考,我设法尝试了您的代码,但结果是一个空白(完全透明)的 png。我也将继续尝试其他一些变化。

以上是关于Imagemagick 旋转透明图像上不需要的黑色背景的主要内容,如果未能解决你的问题,请参考以下文章

Imagemagick 将透明图像裁剪为蒙版

imagemagick - 具有静态黑色背景的动画?

如何使用 imagemagick 将透明 png 旋转 45 度并保持新图像透明?

UINavigtionController Nib 的顶栏黑色不透明在 UIViewController 上不显示黑色

ImageMagick 和 PHP 正确旋转图像

ImageMagick - 沿内部非透明对象边框分割透明度图像