AutoLevel(Channels.RGB)似乎没有任何效果

时间:2016-08-12 07:31:18

标签: magick.net

我试图自动调整图像。我的代码如下所示:

MagickImage image = new MagickImage(stream);
image.AutoLevel(Channels.RGB);

稍后在代码中我将图像发送到网络回复。 出于某种原因,此代码对图像没有影响。它看起来与原始版完全相同。如果我改为:

MagickImage image = new MagickImage(stream);
image.Posterize(2);

然后我清楚地看到应用过滤器。

AutoLevel我缺少什么?

更新

我试过这段代码:

var image1 = Image.Clone();
Image.AutoLevel(Channels.RGB);
var diff = Image.Compare(image1, ErrorMetric.RootMeanSquared);

并且diff的值为0.0,而使用此代码(并使用相同的图像):

var image1 = Image.Clone();
Image.Equalize();
var diff = Image.Compare(image1, ErrorMetric.RootMeanSquared);

diff的值为0.315

1 个答案:

答案 0 :(得分:0)

AutoLevel的效果可能不明显,具体取决于您的输入图像。我使用以下代码进行了快速测试:

using (MagickImage imageA = new MagickImage("logo:"))
{
  imageA.Write(@"c:\imageA.jpg")

  imageA.AutoLevel(Channels.Default);

  using (MagickImage imageB = new MagickImage("logo:"))
  {
    double difference = imageA.Compare(imageB, ErrorMetric.RootMeanSquared);
    Assert.AreNotEqual(0.0, difference);

    imageB.Write(@"c:\imageB.jpg")
  }
}

此测试通过,但差异的值非常小。这意味着当您用眼睛比较图像时,您可能无法找到很大的差异。

以下是一个示例,它将向您显示AutoLevel方法在您使用其他输入图像时执行某些操作。

using (MagickImage imageA = new MagickImage("gradient:gray70-gray30", 150, 100))
{
  imageA.Write(@"c:\imageA.jpg")

  imageA.AutoLevel(Channels.Default);

  using (MagickImage imageB = new MagickImage("gradient:gray70-gray30", 150, 100))
  {
    double difference = imageA.Compare(imageB, ErrorMetric.RootMeanSquared);
    Assert.AreNotEqual(0.0, difference);

    imageB.Write(@"c:\imageB.jpg")
  }
}