首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c#中位图转换为ImageBitmap时出现的问题

在c#中位图转换为ImageBitmap时出现的问题
EN

Stack Overflow用户
提问于 2018-11-10 14:50:42
回答 2查看 124关注 0票数 0

当我将两个像素的位图转换为图像位图时,我将其更改为具有许多像素的普通图像,并将其转换为渐变(黑白像素现在是从黑色到灰色到白色的渐变)。

代码语言:javascript
复制
public static BitmapImage Bitmap2BitmapImage(this Bitmap bitmap)
{
    using (var memory = new MemoryStream())
    {
        bitmap.Save(memory, ImageFormat.Png);
        memory.Position = 0;

        var bitmapImage = new BitmapImage();
        bitmapImage.BeginInit();
        bitmapImage.StreamSource = memory;
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.EndInit();
        bitmapImage.Freeze();

        return bitmapImage;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-11-10 21:31:59

更新:这里有一个方法,可以在不进行平滑的情况下缩放Bitmap

代码语言:javascript
复制
        public static Bitmap Scale(int count, Bitmap source)
    {
        if (count <= 0) { return source; }
        var bitmap = new Bitmap(source.Size.Width * count, source.Size.Height * count);
        var sourcedata = source.LockBits(new Rectangle(new System.Drawing.Point(0, 0), source.Size), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        var bitmapdata = bitmap.LockBits(new Rectangle(new System.Drawing.Point(0, 0), bitmap.Size), ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        unsafe
        {
            var srcByte = (byte*)sourcedata.Scan0.ToPointer();
            var dstByte = (byte*)bitmapdata.Scan0.ToPointer();
            for (var y = 0; y < bitmapdata.Height; y++) {
                for (var x = 0; x < bitmapdata.Width; x++) {
                    long index = (x / count) * 4 + (y / count) * sourcedata.Stride;
                    dstByte[0] = srcByte[index];
                    dstByte[1] = srcByte[index + 1];
                    dstByte[2] = srcByte[index + 2];
                    dstByte[3] = srcByte[index + 3];
                    dstByte += 4;
                }
            }
        }
        source.UnlockBits(sourcedata);
        bitmap.UnlockBits(bitmapdata);

        return bitmap;
    }

在这种情况下,您可以使用以下命令获取正确的BitmapSource

代码语言:javascript
复制
   var bitmapSrc = MyImagingHelper.Scale(100,twoPixelBitmap)//this will get a Bitmap size 200 * 100,change the ratio if it is not enough
   .ToBitmapSource();//Convert to bitmap source

如果您只想将Bitmap转换为BitmapSource以便在WPF控件中显示,请尝试此方法:

代码语言:javascript
复制
    [DllImport("gdi32", EntryPoint = "DeleteObject")]
    public static extern bool DeleteHBitmap(IntPtr hObject);        


    public static BitmapSource ToBitmapSource(this Bitmap target)
    {
        var hbitmap = target.GetHbitmap();
        try {
            return Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
        }
        finally {
            DeleteHBitmap(hbitmap);
        }
    }

不要忽略DeleteHBitmap调用!

票数 0
EN

Stack Overflow用户

发布于 2018-11-10 22:35:00

代码语言:javascript
复制
public Bitmap getRandomTwo()
        {
            Bitmap alone = new Bitmap(1, 2);
            alone.SetPixel(0, 0, Color.White);
            alone.SetPixel(0, 1,Color.Black);
            return alone;
        }

这是生成位图的代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53236682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档