0

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

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

4

1 回答 1

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")
  }
}
于 2016-08-13T21:27:26.897 回答