图像相关(二)

来源:互联网 发布:php获取get数据 编辑:程序博客网 时间:2024/06/15 16:11



        //缩放图像        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;        }