Maschera Gdiplus da un'altra immagine
-
06-07-2019 - |
Domanda
C'è un modo per manipolare l'alfa di un'immagine usando l'alfa di un'altra immagine?
Supponiamo di avere un'immagine e di voler alterare la sua alfa iniziale opaca a sinistra e totalmente trasparente a destra, attualmente disegno un'altra immagine con LinearGradientBrush e imposto l'alfa dell'immagine originale dalla seconda immagine eseguendo il ciclo di pixel per pixel, c'è un altro in Gdiplus, qualche maschera di immagine o fusione di due immagini alfa?
Conclusione: sembra che in GDI + non ci sia modo di fondere due immagini, l'unico modo sembra essere il modo manuale iterando attraverso i pixel.
Soluzione
Penso che tu abbia ragione nel fatto che devi fare questo pixel per pixel. Ho anche cercato un altro "puro" modo di farlo, ma questo è quello che ho finito con:
public enum ChannelARGB
{
Blue = 0,
Green = 1,
Red = 2,
Alpha = 3
}
public static void transferOneARGBChannelFromOneBitmapToAnother(
Bitmap source,
Bitmap dest,
ChannelARGB sourceChannel,
ChannelARGB destChannel )
{
if ( source.Size!=dest.Size )
throw new ArgumentException();
Rectangle r = new Rectangle( Point.Empty, source.Size );
BitmapData bdSrc = source.LockBits( r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb );
BitmapData bdDst = dest.LockBits( r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb );
unsafe
{
byte* bpSrc = (byte*)bdSrc.Scan0.ToPointer();
byte* bpDst = (byte*)bdDst.Scan0.ToPointer();
bpSrc += (int)sourceChannel;
bpDst += (int)destChannel;
for ( int i = r.Height * r.Width; i > 0; i-- )
{
*bpDst = *bpSrc;
bpSrc += 4;
bpDst += 4;
}
}
source.UnlockBits( bdSrc );
dest.UnlockBits( bdDst );
}