图像相关(二) - System.Drawing.Bitmap 的使用



        //缩放图像
        private void ScaleBitmap(string imgUrl)
        {
            //源图像
            System.Drawing.Bitmap oldBmp = new System.Drawing.Bitmap(imgUrl);

            //新图像,并设置新图像的宽高
            System.Drawing.Bitmap newBmp = new System.Drawing.Bitmap(100, 100);
            Graphics draw = Graphics.FromImage(newBmp);//从新图像获取对应的Graphics
            System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, 50, 50);//指定绘制新图像的位置和大小
            draw.DrawImage(oldBmp, rect);//把源图像的全部完整的内容,绘制到新图像rect这个区域内,这不就实现缩放了么

            draw.Dispose();
            oldBmp.Dispose();//一定要把源图Dispose调,因为保存的是相同路径,需要把之前的图顶替调,如果不释放的话会报错:(GDI+ 中发生一般性错误。)
            newBmp.Save(imgUrl);//保存替换到同一个路径
        }


        //裁剪图像
        private void CutBitmap(string imgUrl)
        {
            System.Drawing.Bitmap oldBmp = new System.Drawing.Bitmap(imgUrl);

            //新图像,并设置宽高
            System.Drawing.Bitmap newBmp = new System.Drawing.Bitmap(100, 100);
            Graphics draw = Graphics.FromImage(newBmp);
            draw.DrawImage(oldBmp, 50, 50);//指定目标图像从(x,y)坐标开始绘制

            draw.Dispose();
            oldBmp.Dispose();//一定要把源图Dispose调,因为保存的是相同路径,需要把之前的图顶替调,如果不释放的话会报错:(GDI+ 中发生一般性错误。)
            newBmp.Save(imgUrl);
        }


Bitmap转换为byte[]

        public static byte[] BitmapToBytes(Bitmap bitmap)
        {
            MemoryStream ms = new MemoryStream();
            bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] buffer = ms.ToArray();
            ms.Close();
            ms.Dispose();

            return buffer;
        }

byte[]转换为Bitmap

        public static Bitmap BytesToBitmap(byte[] buffer)
        {
            MemoryStream ms = new MemoryStream(buffer);
            Bitmap bmp = new Bitmap(ms);
            ms.Close();

            return bmp;
        }


Graphics.DrawImage 方法理解

        private void btnTest_Click(object sender, RoutedEventArgs e)
        {
            string imgUrl = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "RemotePhoto");
            //imgUrl += @"\IMG_0005.JPG";
            imgUrl += @"\1.jpg";

            System.Drawing.Image srcImg = System.Drawing.Image.FromFile(imgUrl);//源图像

            Bitmap newBmp = new Bitmap(500,500);
            Graphics draw = Graphics.FromImage(newBmp);
            draw.FillRectangle(System.Drawing.Brushes.Black, 0, 0, newBmp.Width, newBmp.Height);//绘制一层黑底

            //由坐标指定的位置,绘制图像的原始物理大小,如果新图的宽高小于原始图像,则仅显示新图这么大区域的图像,多余的区域不显示,相当于被裁剪掉了(裁剪)
            //draw.DrawImage(srcImg, 0, 0);
            //draw.DrawImage(srcImg,new System.Drawing.Point(0,0));
            //draw.DrawImage(srcImg,new PointF(0.5f,0.5f));

            //指定位置并且指定大小,源图像会缩放或者拉伸到指定大小(缩放)
            //image 要绘制的图像
            //x,y 所绘制图像的x,y
            //width 所绘制图像的宽
            //height 所绘制图像的高
            //注意理解“要绘制”和“所绘制”的区别
            //public void DrawImage(Image image,int x,int y,int width,int height)
            //draw.DrawImage(srcImg, 0, 0, newBmp.Width, newBmp.Height);

            //(缩放)
            //image 要绘制的 Image。
            //rect  指定所绘制图像的位置和大小。(就是destRect)
            //public void DrawImage(Image image,Rectangle rect)
            draw.DrawImage(srcImg, new Rectangle(0,0,newBmp.Width,newBmp.Height));


            //指定想要绘制源图像的区域,则仅绘制这个区域,其他区域不绘制(裁剪)
            //image 要绘制的 Image。
            //x,y 所绘制图像的左上角的 x 坐标。所绘制图像的左上角的 y 坐标。
            //srcRect 它指定 image 对象中要绘制的部分。
            //srcUnit度量单位
            //注意理解“要绘制”和“所绘制”的区别
            //public void DrawImage(Image image,int x,int y,Rectangle srcRect,GraphicsUnit srcUnit)
            //Rectangle srcRect = new Rectangle(10,10,100,100);
            //draw.DrawImage(srcImg, 0, 0, srcRect, GraphicsUnit.Pixel);


            //绘制平行四边形,指定绘制的三个点,第四个点会自动计算出来的(裁剪)
            //System.Drawing.Point leftUpCorner = new System.Drawing.Point(10, 10);//左上角
            //System.Drawing.Point rightUpCorner = new System.Drawing.Point(200, 10);//右上角
            //System.Drawing.Point leftBottomCorner = new System.Drawing.Point(50, 100);//左下角
            //System.Drawing.Point[] destPara = { leftUpCorner, rightUpCorner, leftBottomCorner };
            //draw.DrawImage(srcImg, destPara);

            //根据上面的例子,以下方法的使用就不一一举例了

            //指定源图像的绘制区域,并指定一个四边形
            //destPoints定义一个四变形
            //srcRect定义绘制源图的区域
            //srcUnit度量单位
            //public void DrawImage(Image image,Point[] destPoints,Rectangle srcRect,GraphicsUnit srcUnit)


            //(缩放)
            //destRect目标区域
            //srcX 指定源图坐标x
            //srcY 指定源图u坐标y
            //srcWidth 指定源图宽
            //srcHeight 指定源图高
            //srcUnit度量单位
            //public void DrawImage(Image image,Rectangle destRect,int srcX,int srcY,int srcWidth,int srcHeight,GraphicsUnit srcUnit)
            //Rectangle destRect = new Rectangle(0, 0, newBmp.Width, newBmp.Height);
            //draw.DrawImage(srcImg, destRect, 0, 0, srcImg.Width, srcImg.Height, GraphicsUnit.Pixel);


            //(缩放)
            //destRect目标区域
            //srcRect 源区域
            //public void DrawImage(Image image,Rectangle destRect,Rectangle srcRect,GraphicsUnit srcUnit)
            //Rectangle destRect = new Rectangle(0,0,newBmp.Width,newBmp.Height);
            //Rectangle srcRect = new Rectangle(0,0,srcImg.Width,srcImg.Height);
            //draw.DrawImage(srcImg, destRect, srcRect, GraphicsUnit.Pixel);

            //总结
            //理解“要绘制”和“所绘制”的区别
            //理解"裁剪"和"缩放"的区别


            BitmapImage bmpImg = BitmapToBitmapImage(newBmp);
            imgPic.Source = bmpImg;
        }


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值