कि नमूने में कोड आप के लिए काम करता है, तो आप इसे बड़े पैमाने पर (परिमाण के आदेश द्वारा) Bitmap.LockBits
है, जो एक BitmapData
उद्देश्य यह है कि संकेत के माध्यम से बिटमैप के पिक्सेल डेटा तक पहुँच की अनुमति देता है रिटर्न का उपयोग करके गति कर सकते हैं। वेब पर और स्टैक ओवरफ्लो पर कई नमूने हैं जो दिखाते हैं कि लॉकबिट का उपयोग कैसे करें।
Bitmap.SetPixel()
और Bitmap.GetPixel()
मानव जाति के लिए जाने वाली सबसे धीमी विधियां हैं, और वे दोनों Color
कक्षा का उपयोग करते हैं, जो मानव जाति के लिए सबसे धीमी कक्षा है। उन्हें अवांछित डेवलपर्स को चेतावनी के रूप में Bitmap.GetPixelAndByGodYoullBeSorryYouDid()
और Bitmap.SetPixelWhileGettingCoffee
नामित किया जाना चाहिए था।
अद्यतन: आपको लगता है कि नमूने में कोड को संशोधित करने जा रहे हैं, ध्यान दें कि यह हिस्सा:
Bitmap NewBitmap = (Bitmap)Image.Clone();
अद्यतन 2:
System.Drawing.Bitmap TempBitmap = Image;
System.Drawing.Bitmap NewBitmap = new System.Drawing.Bitmap(TempBitmap.Width,
TempBitmap.Height);
System.Drawing.Graphics NewGraphics =
System.Drawing.Graphics.FromImage(NewBitmap);
NewGraphics.DrawImage(TempBitmap, new System.Drawing.Rectangle(0, 0,
TempBitmap.Width, TempBitmap.Height),
new System.Drawing.Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height),
System.Drawing.GraphicsUnit.Pixel);
NewGraphics.Dispose();
इस के साथ बदला जा सकता है: एडजस्ट कंट्रास्ट विधि (कुछ अन्य गति सुधारों के साथ) का लॉकबिट संस्करण यहां है:
public static Bitmap AdjustContrast(Bitmap Image, float Value)
{
Value = (100.0f + Value)/100.0f;
Value *= Value;
Bitmap NewBitmap = (Bitmap)Image.Clone();
BitmapData data = NewBitmap.LockBits(
new Rectangle(0, 0, NewBitmap.Width, NewBitmap.Height),
ImageLockMode.ReadWrite,
NewBitmap.PixelFormat);
int Height = NewBitmap.Height;
int Width = NewBitmap.Width;
unsafe
{
for (int y = 0; y < Height; ++y)
{
byte* row = (byte*)data.Scan0 + (y * data.Stride);
int columnOffset = 0;
for (int x = 0; x < Width; ++x)
{
byte B = row[columnOffset];
byte G = row[columnOffset + 1];
byte R = row[columnOffset + 2];
float Red = R/255.0f;
float Green = G/255.0f;
float Blue = B/255.0f;
Red = (((Red - 0.5f) * Value) + 0.5f) * 255.0f;
Green = (((Green - 0.5f) * Value) + 0.5f) * 255.0f;
Blue = (((Blue - 0.5f) * Value) + 0.5f) * 255.0f;
int iR = (int)Red;
iR = iR > 255 ? 255 : iR;
iR = iR < 0 ? 0 : iR;
int iG = (int)Green;
iG = iG > 255 ? 255 : iG;
iG = iG < 0 ? 0 : iG;
int iB = (int)Blue;
iB = iB > 255 ? 255 : iB;
iB = iB < 0 ? 0 : iB;
row[columnOffset] = (byte)iB;
row[columnOffset + 1] = (byte)iG;
row[columnOffset + 2] = (byte)iR;
columnOffset += 4;
}
}
}
NewBitmap.UnlockBits(data);
return NewBitmap;
}
नोट: इस कोड को using System.Drawing.Imaging;
आपकी कक्षा में 'विवरणों का उपयोग करके' की आवश्यकता है, और इसके लिए यह आवश्यक है कि प्रोजेक्ट के allow unsafe code
विकल्प को जांचें (प्रोजेक्ट के लिए बिल्ड प्रॉपर्टी टैब पर)।
पिक्सेल-बाय-पिक्सेल ऑपरेशंस के लिए गेट पिक्सेल और सेटपिक्सेल इतनी धीमी है कि विधि कॉल का ओवरहेड स्वयं ही एक बड़ा कारक बनना शुरू कर देता है। आम तौर पर, यहां मेरे कोड नमूने को रिफैक्टरिंग के लिए उम्मीदवार माना जाएगा, क्योंकि आप अपने स्वयं के सेटपिक्सेल और गेट पिक्सेल विधियों को लिख सकते हैं जो मौजूदा बिटमैपडाटा ऑब्जेक्ट का उपयोग करते हैं, लेकिन फ़ंक्शन के अंदर गणित के लिए प्रोसेसिंग समय विधि ओवरहेड से बहुत छोटा होगा प्रत्येक कॉल का। यही कारण है कि मैंने मूल विधि में Clamp
कॉल को भी हटा दिया।
इसे गति देने का एक और तरीका यह केवल एक "विनाशकारी" फ़ंक्शन बनाना होगा, और प्रतिलिपि बनाने और संशोधित प्रति को वापस करने के बजाय पास बिटमैप पैरामीटर को संशोधित करना होगा।
तुम क्यों करते हैं का कहना है कि " वह आदमी "यह गलत हो जाता है? – DkAngelito
@ डीकेएंजेलिटो वाह, यह बहुत समय पहले से है। यदि मेमोरी परोसता है, तो कलरमैट्रिक्स दृष्टिकोण मध्य-बिंदुओं के मूल्यों को दूर/स्थानांतरित नहीं कर सकता है, जो वास्तव में एक कंट्रास्ट एडजस्टमेंट है। यदि यह मदद करता है, तो नीचे MusicGenesis द्वारा स्वीकृत उत्तर ने सर्वसम्मति के रूप में सर्वसम्मति को आकर्षित किया है। –
"यह लड़का" लिंक अब टूटा हुआ है। – Chad