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
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ı.
AForge.NET kitaplığında nasıl uygulandığına bakın, C# kodu here.
temelleri
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
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 ... = ( –
birisi bağlantıyı güncelleyebilir mi? – codejammer
@codejammer http://bit.ly/ZP0Y3x –
Ö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.
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
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
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);
}
matematik kullanmanın amacı nedir?min ve 255 daha büyük olup olmadığını kontrol etmek için if? – AndreaBogazzi
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
Ben perl'de bir imagemagick nesnesi sahip olduğundan bu en doğrudan yolu değil ama işe yarayabilir ... ama etkisi – user83358