2009-06-29 56 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); 

} 
相關問題