Come unire un’immagine in un WriteableBitmap?

Ho una bitmap come questa:

var map = new WriteableBitmap(800,800,800,800, PixelFormats.Bgr32,null); 

E poi ho un’immagine png 50×50 che voglio unire in questa bitmap (trasparenza inclusa) nella posizione offset 100 in alto a sinistra 150 (dall’angolo in alto a sinistra della bitmap)

 var img = new BitmapImage(new Uri(@"D:\test.png", UriKind.Absolute)); 

Ho provato cose come map.WritePixels(img); ma questo genera solo un errore. Come posso unire questa immagine alla bitmap?

Basta copiare i valori del colore in un buffer, quindi copiarli nuovamente in WriteableBitmap

 public void Chubs_BitBltMerge(ref WriteableBitmap dest, int nXDest, int nYDest, ref BitmapImage src) { // copy the source image into a byte buffer int src_stride = src.PixelWidth * (src.Format.BitsPerPixel >> 3); byte[] src_buffer = new byte[src_stride * src.PixelHeight]; src.CopyPixels(src_buffer, src_stride, 0); // copy the dest image into a byte buffer int dest_stride = src.PixelWidth * (dest.Format.BitsPerPixel >> 3); byte[] dest_buffer = new byte[(src.PixelWidth * src.PixelHeight) << 2]; dest.CopyPixels(new Int32Rect(nXDest, nYDest, src.PixelWidth, src.PixelHeight), dest_buffer, dest_stride, 0); // do merge (could be made faster through parallelization) for (int i = 0; i < src_buffer.Length; i = i + 4) { float src_alpha = ((float)src_buffer[i + 3] / 255); dest_buffer[i + 0] = (byte)((src_buffer[i + 0] * src_alpha) + dest_buffer[i + 0] * (1.0 - src_alpha)); dest_buffer[i + 1] = (byte)((src_buffer[i + 1] * src_alpha) + dest_buffer[i + 1] * (1.0 - src_alpha)); dest_buffer[i + 2] = (byte)((src_buffer[i + 2] * src_alpha) + dest_buffer[i + 2] * (1.0 - src_alpha)); } // copy dest buffer back to the dest WriteableBitmap dest.WritePixels(new Int32Rect(nXDest, nYDest, src.PixelWidth, src.PixelHeight), dest_buffer, dest_stride, 0); } 

 public MainWindow() { InitializeComponent(); BitmapImage texture = new BitmapImage(new Uri("50x50.png", UriKind.Relative)); Image background = new Image(); background.Source = new BitmapImage(new Uri("backdrop.png", UriKind.Relative)); WriteableBitmap wb = new WriteableBitmap((BitmapSource)background.Source); // bit the 50x50 onto the backdrop Chubs_BitBltMerge(ref wb, 150, 100, ref texture); // set the result to an Image in XAML to see the result //this.myImage.Source = wb; //this.myImage.Width = wb.PixelWidth; //this.myImage.Height = wb.PixelHeight; } 

inserisci la descrizione dell'immagine qui