हाँ, यह करने के लिए तेजी से रास्ता Bitmap.LockBits
का उपयोग करें और सूचक अंकगणित का उपयोग GetPixel
और SetPixel
के बजाय मूल्यों को पुनः प्राप्त करने के लिए है। निश्चित रूप से नकारात्मक बात यह है कि आपको असुरक्षित कोड का उपयोग करना होगा; यदि आप कोई गलती करते हैं, तो आप अपने कार्यक्रम में कुछ वाकई खराब क्रैश कर सकते हैं। लेकिन अगर आप इसे सरल और आत्मनिर्भर रखते हैं, तो यह ठीक होना चाहिए (हे, अगर मैं कर सकता हूं, तो आप इसे भी कर सकते हैं)।
उदाहरण के लिए, आप (अपने जोखिम पर परीक्षण नहीं किया, उपयोग) कुछ इस तरह कर सकता है:
Bitmap mask = ...;
Bitmap input = ...;
Bitmap output = new Bitmap(input.Width, input.Height, PixelFormat.Format32bppArgb);
var rect = new Rectangle(0, 0, input.Width, input.Height);
var bitsMask = mask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
var bitsInput = input.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
var bitsOutput = output.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
unsafe
{
for (int y = 0; y < input.Height; y++)
{
byte* ptrMask = (byte*) bitsMask.Scan0 + y * bitsMask.Stride;
byte* ptrInput = (byte*) bitsInput.Scan0 + y * bitsInput.Stride;
byte* ptrOutput = (byte*) bitsOutput.Scan0 + y * bitsOutput.Stride;
for (int x = 0; x < input.Width; x++)
{
ptrOutput[4 * x] = ptrInput[4 * x]; // blue
ptrOutput[4 * x + 1] = ptrInput[4 * x + 1]; // green
ptrOutput[4 * x + 2] = ptrInput[4 * x + 2]; // red
ptrOutput[4 * x + 3] = ptrMask[4 * x]; // alpha
}
}
}
mask.UnlockBits(bitsMask);
input.UnlockBits(bitsInput);
output.UnlockBits(bitsOutput);
output.Save(...);
यह उदाहरण मुखौटा छवि में नीले चैनल से उत्पादन में अल्फ़ा चैनल निकला । मुझे यकीन है कि यदि आवश्यक हो तो आप मास्क के लाल या अल्फा चैनल का उपयोग करने के लिए इसे बदल सकते हैं।
चूंकि आप कहते हैं कि आप सिस्टम का उपयोग कर रहे हैं। ड्रॉइंग.ग्राफिक्स, यह शायद ऑफ-विषय है, लेकिन यहां WPF में अस्पष्टता मास्क का एक लिंक है, जो हार्डवेयर त्वरण का लाभ उठाएगा: http://msdn.microsoft.com/ en-us/library/system.windows.media.drawinggroup.opacitymask.aspx – Douglas
ऑफ-विषय, लेकिन फिर भी आकर्षक - धन्यवाद! – Origamiguy