zoukankan      html  css  js  c++  java
  • 【C#/WPF】图像数据格式转换时,透明度丢失的问题

    问题:工作中涉及到图像的数据类型转换,经常转着转着发现,到了哪一步图像的透明度丢失了!


    例如,Bitmap转BitmapImage的经典代码如下:

    public static BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            bitmap.Save(stream, ImageFormat.Bmp);
    
            stream.Position = 0;
            BitmapImage result = new BitmapImage();
            result.BeginInit();
            // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
            // Force the bitmap to load right now so we can dispose the stream.
            result.CacheOption = BitmapCacheOption.OnLoad;
            result.StreamSource = stream;
            result.EndInit();
            result.Freeze();
    
            return result;
        }
    }

    使用时发现,如果一张图片四周是透明的,那么转出来的BitmapImage图像四周透明部分会被自动填充为黑色的!解决办法在于修改Bitmap保存时选择的格式,把Bmp改为Png即可。

    bitmap.Save(stream, ImageFormat.Png);

    同样,类似的经验教训还有如下,在图片数据格式转换时,常常要注意是否保留有α通道透明度数据,
    比如在ImageSource转为System.Drawing.Bitmap的方法:

    public static System.Drawing.Bitmap ImageSourceToBitmap(ImageSource imageSource)
    {
        BitmapSource m = (BitmapSource)imageSource;
    
        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(m.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    
        System.Drawing.Imaging.BitmapData data = bmp.LockBits(
        new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    
        m.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
        bmp.UnlockBits(data);
    
        return bmp;
    }

    要非常细心,看清楚选择的格式

    System.Drawing.Imaging.PixelFormat.Format32bppPArgb; // 带有α通道的
    System.Drawing.Imaging.PixelFormat.Format32bppRgb;   // 不带α通道的
  • 相关阅读:
    解决MyBatis的Mapper XML错误,系统起不来,也不报错问题
    tomcat启动卡在“INFO com.alibaba.druid.pool.DruidDataSource
    加速github访问速度
    LAN、WAN和WLAN的区别
    面试记录一
    C++纯虚函数(接口类)的使用
    CentOS 安装 Docker CE
    通过 plsql 连接远程 Oracle
    Yum 软件仓库配置
    qW3xT.2,解决挖矿病毒
  • 原文地址:https://www.cnblogs.com/guxin/p/csharp-wpf-image-format-convert-with-alpha-channel.html
Copyright © 2011-2022 走看看