如何合并图片到WriteableBitmap的? [英] How to merge a picture into a WriteableBitmap?

查看:191
本文介绍了如何合并图片到WriteableBitmap的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的位图:

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

然后,我有我要合并到这个位图(包括透明度)的位置偏移量前100名留下150(从位图的左上角)

And then i have a 50x50 png picture which i want to merge into this bitmap (transparency included) at the position offset top 100 left 150 (from the top left corner of the bitmap)

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

我试着像 map.WritePixels(IMG); 但只是抛出一个错误。 我如何可以合并该图像转换成位图?

I tried things like map.WritePixels(img); but that just throws an error. How can i merge this image into the bitmap?

推荐答案

只是颜色值复制到缓冲区中,然后复制回WriteableBitmap的

Just copy the color values to a buffer then copy that back to the 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;

}



这篇关于如何合并图片到WriteableBitmap的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆