Sì, il modo più veloce per farlo è utilizzare Bitmap.LockBits
e utilizzare l'aritmetica del puntatore per recuperare i valori anziché GetPixel
e SetPixel
. Lo svantaggio, ovviamente, è che devi usare un codice non sicuro; se commetti un errore, puoi causare alcuni crash davvero brutti nel tuo programma. Ma se lo si mantiene semplice e autonomo, dovrebbe andare bene (hey, se posso farlo, puoi farlo anche tu).
Ad esempio, si potrebbe fare qualcosa di simile (non testato, l'uso a proprio rischio):
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(...);
Questo esempio deriva il canale alfa in uscita dal blu canale l'immagine maschera . Sono sicuro che puoi cambiarlo per usare il canale rosso o alfa della maschera, se necessario.
Dal momento che si dice che si sta utilizzando System.Drawing.Graphics, questo è probabilmente off-topic, ma ecco un link per maschere di opacità in WPF, che potranno usufruire di accelerazione hardware: http://msdn.microsoft.com/ en-us/library/system.windows.media.drawinggroup.opacitymask.aspx – Douglas
off-topic, ma comunque affascinante: grazie! – Origamiguy