2009-06-29 96 views
7

创建棕褐色调所需的基本操作是什么?我的参考点是perl imagemagick库,所以我可以轻松使用任何基本操作。我试图量化(使其灰度),着色,然后增强图像,但它仍然有点模糊。如何创建棕褐色调?

回答

1

如果您使用imagemagic命令行,这很容易。

http://www.imagemagick.org/script/convert.php

转换时

使用 “-sepia音门槛” 的说法。

奇怪的是,PerlMagick API似乎不包括方法,直接这样做:

http://www.imagemagick.org/script/perl-magick.php

...以及任何棕褐色方法没有提及。

+0

因为我有Perl中的ImageMagick的对象,这不是最直接的方式,但它可以工作...但它似乎并不需要使用其他颜色的效果 – user83358 2009-07-01 21:54:19

1

看看它是如何在AForge.NET库中实现的,C#代码是here

的基础似乎是

  • 它转换到YIQ色彩空间
  • 修改
  • 变换回RGB

全alrogithm是在源代码中,加解释了RGB→YIQ和YIQ→RGB变换。在C#中的深褐色转换器的

+0

的代码链接的选项不再工作... =( – 2012-02-25 22:14:20

+0

可以有人更新链接? – codejammer 2012-12-19 06:58:37

+1

@codejammer http://bit.ly/ZP0Y3x – 2012-12-19 16:02:56

20

示例代码是在我的答案在这里可供选择:What is wrong with this sepia tone conversion algorithm?

算法来自this page,每个输入像素的颜色变换以下列方式:

outputRed = (inputRed * .393) + (inputGreen *.769) + (inputBlue * .189) 
outputGreen = (inputRed * .349) + (inputGreen *.686) + (inputBlue * .168) 
outputBlue = (inputRed * .272) + (inputGreen *.534) + (inputBlue * .131) 

如果这些输出值中的任何一个大于255,则只需将其设置为 为255.这些特定值是Microsoft推荐的 棕褐色调的值。

3

这是在C#中,但是,基本概念是相同的。您可能可以将其转换为perl。

private void SepiaBitmap(Bitmap bmp) 
{ 
    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 
    System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, 
     System.Drawing.Imaging.PixelFormat.Format32bppRgb); 

    IntPtr ptr = bmpData.Scan0; 

    int numPixels = bmpData.Width * bmp.Height; 
    int numBytes = numPixels * 4; 
    byte[] rgbValues = new byte[numBytes]; 

    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, numBytes); 
    for (int i = 0; i < rgbValues.Length; i += 4) 
    { 
     rgbValues[i + 2] = (byte)Math.Min((.393 * red) + (.769 * green) + (.189 * (blue)), 255.0); //red 
     rgbValues[i + 1] = (byte)Math.Min((.349 * red) + (.686 * green) + (.168 * (blue)), 255.0); //green 
     rgbValues[i + 0] = (byte)Math.Min((.272 * red) + (.534 * green) + (.131 * (blue)), 255.0); //blue 
     if ((rgbValues[i + 2]) > 255) 
     { 
      rgbValues[i + 2] = 255; 
     } 

     if ((rgbValues[i + 1]) > 255) 
     { 
      rgbValues[i + 1] = 255; 
     } 
     if ((rgbValues[i + 0]) > 255) 
     { 
      rgbValues[i + 0] = 255; 
     } 
    } 

    System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, numBytes); 
    this.Invalidate(); 
    bmp.UnlockBits(bmpData); 

}