2009-06-29 12 views
7

सेपिया टोन बनाने के लिए आवश्यक बुनियादी संचालन क्या हैं? मेरा संदर्भ बिंदु perl imagemagick लाइब्रेरी है, इसलिए मैं आसानी से किसी भी मूल ऑपरेशन का उपयोग कर सकता हूं। मैंने मापने की कोशिश की है (इसे ग्रेस्केल बनाना), रंगीन करें, और फिर छवि को बढ़ाएं लेकिन यह अभी भी थोड़ा धुंधला है।एक सेपिया टोन कैसे बनाया गया है?

उत्तर

1

यदि आप imagemagic कमांड लाइन का उपयोग करते हैं तो यह आसान है।

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

उपयोग "-sepia टोन सीमा" तर्क जब परिवर्तित।

अजीब पर्याप्त, PerlMagick एपीआई सीधे ऐसा करने के लिए एक विधि शामिल करने के लिए प्रतीत नहीं होता:

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

... और किसी भी भूरा विधि के लिए कोई संदर्भ।

+0

जब से मैं पर्ल में एक ImageMagick वस्तु है यह सबसे सीधा तरीका नहीं है बल्कि यह काम कर सकता था ... लेकिन यह प्रभाव – user83358

1

AForge.NET लाइब्रेरी में इसे कैसे कार्यान्वित किया गया है, इस पर एक नज़र डालें, सी # कोड here है।

मूल बातें होने की

  • YIQ रंग अंतरिक्ष के लिए यह बदलने लगते हैं
  • इसे संशोधित
  • आरजीबी

पूर्ण alrogithm स्रोत कोड में है, के साथ साथ वापस करने के लिए बदलना आरजीबी -> वाईआईक्यू और वाईआईक्यू -> आरजीबी परिवर्तनों को समझाया गया है। सी # में एक सेपिया कनवर्टर का

+0

कोड लिंक के लिए अन्य रंगों का उपयोग करने का विकल्प भी दिखाई नहीं देता अब और काम नहीं करता है ... = ( –

+0

क्या कोई लिंक अपडेट कर सकता है? – codejammer

+1

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

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 पर सेट करें। ये विशिष्ट मान सेपिया टोन के मान हैं जो माइक्रोसॉफ्ट द्वारा अनुशंसित हैं।

+0

पर कॉल करना पड़ा आपको गणित का उपयोग करने की आवश्यकता होगी। मेरी संभावना है। मैंने उन तीन पंक्तियों के बाद 255 के लिए चेक करने का प्रयास किया और एक त्रुटि होगी। मैं आज भी उसी समस्या का सामना कर रहा था जब मैं अपने कार्यक्रम के लिए सेपिया टोन बनाने की कोशिश कर रहा था .. – BigBug

+0

लेकिन अगर मैं चा के लिए कुछ अलग करना चाहता हूं तो क्या होगा फ़िल्टर को बंद करें तो मैं इन मानों को कैसे प्राप्त कर सकता हूं? मेरे प्रश्न की तरह यह है कि हमें इन मूल्यों के बारे में कैसे पता चला, क्या हमें बार-बार अलग-अलग मूल्यों को रखने की ज़रूरत है? – AHF

3

यह सी # में है, हालांकि, बुनियादी अवधारणाएं समान हैं। आप इसे पर्ल में परिवर्तित करने में सक्षम होंगे।

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

गणित का उपयोग करने का क्या मतलब है।मिनट और यदि 255 का बड़ा है तो जांचने के लिए? – AndreaBogazzi

+0

गणना के मानों को बाइट रेंज पर क्लैंप करने के लिए 'Math.Min' आवश्यक है। उन 'if' कथन जो पूरी तरह से व्यर्थ हैं। 'rgbValues' एक 'बाइट' सरणी है, इसलिए इसके किसी भी मान संभवतः> 255 हो सकता है – saucecontrol

संबंधित मुद्दे