代码之家  ›  专栏  ›  技术社区  ›  mspir

Imagemagick trimimage函数还可以在图像中出现背景色时进行修剪(不仅仅是边框)

  •  1
  • mspir  · 技术社区  · 6 年前

    因此,我尝试用imagemagick trimmimage函数(PHP)根据背景色修剪图像的边框。下面是一个演示我正在尝试做什么,以及问题是什么。

    enter image description here

    并运行以下代码:

    $canvas->setBackgroundColor('#ffffff');
    $quantumRange = $canvas->getQuantumRange();
    $canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
    $canvas->setImagePage(0, 0, 0, 0);
    

    结果正是我所期望的:白色的边框被修剪掉了。 enter image description here

    enter image description here

    运行相同的代码,图像从内部被修剪(?)有一些奇怪的效果: enter image description here

    现在,根据我的理解,trimimage应该采用背景色,从外到内进行修剪,并且只有当图像的外缘(边框)与此颜色匹配时。

    所以实际问题是: 1当外部边框颜色与背景颜色匹配时,是否有方法仅从外部向内裁剪图像?也许我错过了什么。

    编辑: 在@fmw42回答了下面的问题后,我仔细研究了边缘检测到底是什么以及它是如何工作的。我的假设是imagemagick查看图像的边界并根据给定的背景颜色进行剪切,这是错误的。为了更好地理解,请检查边缘检测的工作原理: https://en.wikipedia.org/wiki/Edge_detection

    1 回复  |  直到 6 年前
        1
  •  2
  •   fmw42    6 年前

    Imagemagick-trim仅当边颜色在fuzz值内时,才会从每个边进行修剪。你的白色背景不起作用。trim函数查看边的颜色并向内修剪,直到边的行和列超过边上颜色的fuzz值。它查看角颜色以确定是否修剪。在第一种情况下,有3个白色角。所以它会修剪顶部和右侧的白色。在第二种情况下,现在有3个蓝色角。因此,它会在顶部和右侧向内修剪,以去除一些蓝色。

    输入1:

    enter image description here

    convert image1.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image_trim.jpg
    


    请注意,30%相当于0.3*量程

    enter image description here

    图像2:

    enter image description here

    convert image2.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image2a_trim.jpg
    


    enter image description here

    convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg
    


    enter image description here

    convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg
    


    enter image description here