dql1978dql1978 2017-04-21 13:49
浏览 534
已采纳

ImageMagick白色到透明背景,当维护白色对象时

I am using PHP's ImageMagick to turn the white background of an image, transparent. I pass the image URL to this PHP script and it returns the image.

<?php

# grab the remote image url
$imgUrl = $_GET['img'];

# create new ImageMagick object
$im = new Imagick($imgUrl);

# remove extra white space
$im->clipImage(0);

# convert white background to transparent
$im->paintTransparentImage($im->getImageBackgroundColor(), 0, 3000);

# resize image --- passing 0 as width invokes proportional scaling
$im->resizeImage(0, 200, Imagick::FILTER_LANCZOS, 1);

# set resulting image format as png
$im->setImageFormat('png');

# set header type as PNG image
header('Content-Type: image/png');

# output the new image
echo $im->getImageBlob();

These transformations work pretty well. However, if I have an image with a white object, it doesn't work very well as a result of passing a fuzz value to paintTransparentImage(); which is how I am cleaning up jagged edges.

Here's an example of the result, note the white sofa:

enter image description here

If I don't pass a fuzz value, then I get a proper cut, but i'm left with messy edges:

enter image description here

I have attempted to use resizeImage() in an effort to achieve what's called 'spatial anti-aliasing' (blow up the image really big -> use paintTransparentImage() -> shrink image back down), but I didn't notice any significant changes.

Is there something I can do to better handle these really white images? I've played about with trimImage() and edgeImage(), but I'm not able to get the results i'm after.

Worst case scenario, (though not ideal), is there a means of identifying if an image contains some percentage of a particular colour? IE. if image contains >90% white pixels then I could run paintTransparentImage() with a fuzz value of 0 instead of 3000 which would at least give me a proper cut.

Thanks.

  • 写回答

1条回答 默认 最新

  • dongye9228 2017-04-21 15:43
    关注

    SOLUTION:

    Replace white background with some other colour first, then change that colour to transparent.

    <?php
    
    # get img url
    $imgUrl = $_GET['img'];
    
    # create new ImageMagick object from image url
    $im = new Imagick($imgUrl);
    
    # replace white background with fuchsia
    $im->floodFillPaintImage("rgb(255, 0, 255)", 2500, "rgb(255,255,255)", 0 , 0, false);
    
    #make fuchsia transparent
    $im->paintTransparentImage("rgb(255,0,255)", 0, 10);
    
    # resize image --- passing 0 as width invokes proportional scaling
    $im->resizeImage(0, 200, Imagick::FILTER_LANCZOS, 1);
    
    # set resulting image format as png
    $im->setImageFormat('png');
    
    # set header type as PNG image
    header('Content-Type: image/png');
    
    # output the new image
    echo $im->getImageBlob();
    

    enter image description here

    enter image description here

    enter image description here

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 前台报错,加我微信帮我解决一下,15043457399
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题