2009-06-29 30 views
7

Sepya tonu oluşturmak için gerekli temel işlemler nelerdir? Referans noktam perl imagemagick kütüphanesidir, bu yüzden herhangi bir temel işlemi kolayca kullanabilirim. Nicelemeyi (gri tonlamalı hale getirmeyi), renklendirmeyi ve daha sonra görüntüyü geliştirmeyi denedim, ancak hala biraz bulanık.Sepya sesi nasıl oluşturulur?

cevap

1

Imaginagic komut satırını kullanırsanız kolaydır.

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

kullanımlar "-sepia ton eşiği" bağımsız değişkeni dönüştürülmesi.

Gariptir ki, PerlMagick API doğrudan bu iş için bir yöntem içerir görünmüyor:

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

... ve herhangi Sepya yöntemine hiçbir referansı.

+0

Ben perl'de bir imagemagick nesnesi sahip olduğundan bu en doğrudan yolu değil ama işe yarayabilir ... ama etkisi – user83358

1

AForge.NET kitaplığında nasıl uygulandığına bakın, C# kodu here.

temelleri

  • RGB
  • tam alrogithm kaynak kodunda, artı geri dönüşümü değiştirmek

    • YIQ renk alanına dönüştürmek gibi görünüyor RGB -> YIQ ve YIQ -> RGB dönüşümleri açıklanmıştır. C# bir sepya konvertör

    +0

    kod bağlantı için başka renkler kullanmak için bir seçenek var gibi görünmüyor artık çalışmıyor ... = ( –

    +0

    birisi bağlantıyı güncelleyebilir mi? – codejammer

    +1

    @codejammer http://bit.ly/ZP0Y3x –

    20

    Örnek kod burada cevabım mevcuttur:

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

    : What is wrong with this sepia tone conversion algorithm?

    algoritması this page itibaren, her giriş piksel renk şu şekilde dönüşür geliyor Bu çıkış değerlerinden herhangi biri 255'ten büyükse, - 255 değerini ayarlayabilirsiniz. Bu belirli değerler, Microsoft tarafından önerilen sepya tonu değerleridir.

    +0

    Muhtemelen Math.Min kullanmanız gerekecektir.Bu üç satırdan sonra 255 için kontrol yapmayı denedim ve bir hata meydana gelecektir.Programım için bir sepya tonu yapmaya çalıştığımda bugün aynı sorunla karşı karşıyaydım .. – BigBug

    +0

    Ama ya cha farklı bir şey istersem Filtre nge o zaman bu değerlere nasıl ulaşabilirim? Benim sorum gibi bu değerler hakkında nasıl bilgi edindiğimiz, tekrar tekrar farklı değerler koymamız gerekecek mi? – AHF

    3

    Bu C# 'da bulunur, ancak temel kavramlar aynıdır. Bunu muhtemelen perl'e dönüştürebilirsiniz.

    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); 
    
    } 
    
    +0

    matematik kullanmanın amacı nedir?min ve 255 daha büyük olup olmadığını kontrol etmek için if? – AndreaBogazzi

    +0

    Hesaplanan değerleri bayt aralığına sabitlemek için 'Math.Min' gereklidir. Aşağıdaki '' 'ifadeleri tamamen anlamsızdır. "rgbValues" bir "byte" dizisidir, bu nedenle değerlerinin hiçbiri> 255 olabilir. – saucecontrol