当前位置:编程学习 > C#/ASP.NET >>

加载图片处理的问题代码

 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim videoBitmap As Bitmap = Image.FromFile("c:\aa.bmp")

        Dim gg As Graphics = Graphics.FromImage(videoBitmap)

        gg.DrawLine(Pens.Red, 0, 0, 200, 100)

        PictureBox1.Image = videoBitmap

        'GC.Collect()

    End Sub


以上代码大概每秒运行20次左右。c:\aa.bmp 文件大小是5M  运行的时候内存一直在增加,增加200多M 后 回归正常,然后继续增加。
不使用gc.collect 语句,还有什么写法可以解决?
--------------------编程问答-------------------- 如果图片是固定的,那么在开始前先载入图片,每次画的时候就不需要从硬盘里读取,速度更快。
因为你每次都new出来一个bitmap,所以每次都会为图片开辟一块内存,当垃圾回收周期没到时,则内存会一直增加。
如果能重复利用一张图片,则可以解决内存增加的问题,否则就只能GC.Collect了 --------------------编程问答-------------------- 图片是变化的。

picturbox1 得到处理后的图片后 如何释放 bitmap?

PictureBox1.Image = Image.FromFile("c:\aa.bmp")   就反复执行这句,内存加的一塌糊涂 --------------------编程问答--------------------
引用 2 楼 lxcy 的回复:
图片是变化的。

picturbox1 得到处理后的图片后 如何释放 bitmap?

PictureBox1.Image = Image.FromFile("c:\aa.bmp")   就反复执行这句,内存加的一塌糊涂

gg也需要Dispose --------------------编程问答-------------------- gg.Dipose();
videoBitmap.Dipose(); --------------------编程问答--------------------
引用 4 楼 lexiaoyao20 的回复:
gg.Dipose();
videoBitmap.Dipose();


videobitmap.dispose   是错的。 --------------------编程问答--------------------
引用 5 楼 lxcy 的回复:
引用 4 楼 lexiaoyao20 的回复:
gg.Dipose();
videoBitmap.Dipose();


videobitmap.dispose   是错的。

你的bitmap被picturebox引用了,不能dispose --------------------编程问答--------------------
/// <summary>
    /// 图片处理类
    /// </summary>
    public class Image
    {
        /// <summary>
        /// 加图片水印
        /// </summary>
        /// <param name="filePath">原图片路径</param>
        /// <param name="waterPath">水印图片路径</param>
        /// <returns>加完水印后的文件名</returns>
        public static string WaterPic(string filePath, string waterPath)
        {
            string dir = System.IO.Path.GetDirectoryName(filePath);
            string filename = System.IO.Path.GetFileName(filePath);
            string ext = System.IO.Path.GetExtension(filePath);
            if (ext != ".bmp" && ext != ".jpg" && ext != ".png") return "";
            //加图片水印
            System.Drawing.Image image = System.Drawing.Image.FromFile(filePath);
            System.Drawing.Image copyImage = System.Drawing.Image.FromFile(waterPath);
            Graphics g = Graphics.FromImage(image);
            g.DrawImage(copyImage, new Rectangle(image.Width - copyImage.Width, image.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
            g.Dispose();
            copyImage.Dispose();
            //保存加水印过后的图片,删除原始图片 
            string newPath = dir + "\\w_" + filename;
            if (ext == ".jpg") image.Save(newPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            if (ext == ".bmp") image.Save(newPath, System.Drawing.Imaging.ImageFormat.Bmp);
            if (ext == ".png") image.Save(newPath, System.Drawing.Imaging.ImageFormat.Png);
            image.Dispose();

            return "\\w_" + filename;

        }

        /// 生成缩略图        
        /// </summary>        
        /// <param name="originalImagePath">源图路径(物理路径)</param>      
        ///<param name="thumbnailPath">缩略图路径(物理路径)</param>      
        ///<param name="width">缩略图宽度</param>       
        ///<param name="height">缩略图高度</param>        
        /// <param name="mode">生成缩略图的方式</param> 
        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        {
            System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
            int towidth = width;
            int toheight = height;
            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;
            switch (mode)
            {
                case "HW"://指定高宽缩放(可能变形)               
                    break;
                case "W"://指定宽,高按比例                   
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H"://指定高,宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut"://指定高宽裁减(不变形)               
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }

            //新建一个bmp图片           
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(width, height);
            //新建一个画板            
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);
            //设置高质量插值法            
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            //设置高质量,低速度呈现平滑程度           
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //清空画布并以透明背景色填充           
            g.Clear(Color.Transparent);
            //在指定位置并且按指定大小绘制原图片的指定部分          
            g.DrawImage(originalImage, new Rectangle(0, 0, height, height), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
            try
            {   //以jpg格式保存缩略图               
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e) { throw e; }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        }
    }
--------------------编程问答-------------------- --------------------编程问答-------------------- 顶起来 --------------------编程问答-------------------- private _B as bitmap

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
if _B isnot nothing then _B.Dispose()
   _B= new bitmap("c:\aa.bmp")

   Dim gg As Graphics = Graphics.FromImage(videoBitmap)

   gg.DrawLine(Pens.Red, 0, 0, 200, 100)

   PictureBox1.Image = videoBitmap
  
   End Sub
补充:.NET技术 ,  VB.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,