• winform双缓冲, 从内存画图到到picturebox


     base.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

    private Image DrawImage(string strFilePath)

            {
                try
                {
                    Bitmap bitmap = new Bitmap(strFilePath);
                    //如果原图片是索引像素格式之列的,则需要转换
                    if (IsPixelFormatIndexed(bitmap.PixelFormat))
                    {
                        Bitmap bmp = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb);
                        using (Graphics g = Graphics.FromImage(bmp))
                        {
                            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                            g.DrawImage(bitmap, 00);
                            Pen pen = new Pen(Color.Red, 3);
                            for (int i = 0; i < bitmap.Width; i += bitmap.Width / 4)
                            {
                                g.DrawLine(pen, i, 0, i, bitmap.Height);
                            }
                            for (int i = 0; i < bitmap.Height; i += bitmap.Height / 4)
                            {
                                g.DrawLine(pen, 0, i, bitmap.Width, i);
                            }
                        }
                    }
                    else
                    {
                        Graphics g = Graphics.FromImage(bitmap);
                        g.DrawImage(bitmap, bitmap.Width, bitmap.Height);
                        Pen pen = new Pen(Color.Red, 3);
                        for (int i = 0; i < bitmap.Width; i += bitmap.Width / 4)
                        {
                            g.DrawLine(pen, i, 0, i, bitmap.Height);
                        }
                        for (int i = 0; i < bitmap.Height; i += bitmap.Height / 4)
                        {
                            g.DrawLine(pen, 0, i, bitmap.Width, i);
                        }
                    }
                    return bitmap;
                }
                catch { return null; }
            }

       /// <summary>
            
    /// 会产生graphics异常的PixelFormat
            
    /// </summary>
            private static PixelFormat[] indexedPixelFormats = { PixelFormat.Undefined, PixelFormat.DontCare,
                PixelFormat.Format16bppArgb1555, PixelFormat.Format1bppIndexed, PixelFormat.Format4bppIndexed,
                PixelFormat.Format8bppIndexed
            };
            /// <summary>
            
    /// 判断图片的PixelFormat 是否在 引发异常的 PixelFormat 之中
            
    /// </summary>
            
    /// <param name="imgPixelFormat">原图片的PixelFormat</param>
            
    /// <returns></returns>
            private static bool IsPixelFormatIndexed(PixelFormat imgPixelFormat)
            {
                foreach (PixelFormat pf in indexedPixelFormats)
                {
                    if (pf.Equals(imgPixelFormat)) return true;
                }

                return false;

            }

    下面这个函数从内存画图到picbox, 因为有些图片是索引色, 所以先鉴定了下图片. 画图时用线画了格子. 不用时可以去了.

  • 相关阅读:
    系统分析员、系统架构师、项目经理的区别
    C# 委托(Delegate) 事件(Event)应用详解
    项目管理的通俗解释
    什么是依赖注入
    程序员每天该做的事
    鸿蒙应用开发入门(三):开发第一个鸿蒙应用
    #2020征文手机# 零基础鸿蒙开发4 如何播放一个全屏视频(JS版)
    【资源下载】快来获取HarmonyOS官方通用规范图标
    #2020征文手机# 快速搭建一款鸿蒙分布式分歧终端机原型
    #2020征文TV#鸿蒙应用开发TVHelloWord (二) 传递数据、跳转
  • 原文地址:https://www.cnblogs.com/barrysgy/p/2276971.html
Copyright © 2020-2023  润新知