图像处理

Posted 小小的菜鸟程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像处理相关的知识,希望对你有一定的参考价值。

  1 public class ImageDraw
  2 {
  3 public Image NewBitmap(int w, int h, float dpix, float dpiy)
  4 {
  5 var rt = new Bitmap(w, h);
  6 rt.SetResolution(dpix, dpiy);
  7 return rt;
  8 }
  9 
 10 /// <summary> 得到图像的指定区域.
 11 /// </summary>
 12 /// <param name="source"></param>
 13 /// <param name="rect"></param>
 14 /// <returns></returns>
 15 public Image GetImageRect(Image source, Rectangle rect)
 16 {
 17 var rt = NewBitmap(rect.Width, rect.Height, source.HorizontalResolution, source.VerticalResolution);
 18 Graphics gh = Graphics.FromImage(rt);
 19 gh.DrawImage(source, 0, 0, rect, GraphicsUnit.Pixel);
 20 gh.Save();
 21 gh.Dispose();
 22 return rt;
 23 }
 24 
 25 /// <summary> 拉伸图像.
 26 /// </summary>
 27 /// <param name="source"></param>
 28 /// <param name="newSize"></param>
 29 /// <returns></returns>
 30 public Image GetStretchImage(Image source, Size newSize)
 31 {
 32 var w = source.Width;
 33 var h = source.Height;
 34 
 35 var rt = NewBitmap(newSize.Width, newSize.Height, source.HorizontalResolution, source.VerticalResolution);
 36 var gh = Graphics.FromImage(rt);
 37 
 38 gh.DrawImage(source, new Rectangle(0, 0, newSize.Width, newSize.Height), new Rectangle(0, 0, w, h), GraphicsUnit.Pixel);
 39 
 40 gh.Save();
 41 gh.Dispose();
 42 
 43 return rt;
 44 }
 45 
 46 /// <summary> 拉伸图像至合适大小,并保持纵横比..
 47 /// </summary>
 48 /// <param name="source"></param>
 49 /// <param name="newSize"></param>
 50 /// <returns></returns>
 51 public Image GetAdaptiveImage(Image source, Size newSize)
 52 {
 53 var sw = source.Width;
 54 var sh = source.Height;
 55 var tw = newSize.Width;
 56 var th = newSize.Height;
 57 
 58 double wb = sw * 1.0 / tw;
 59 double hb = sh * 1.0 / th;
 60 
 61 //计算目标图像宽高.
 62 if (wb > hb)
 63 {
 64 //取宽度作为标准 
 65 th = (int)(sh / wb);
 66 }
 67 else
 68 {
 69 tw = (int)(sw / hb);
 70 }
 71 
 72 //生成图像
 73 return GetStretchImage(source, new Size(tw, th));
 74 }
 75 
 76 /// <summary> 剪裁图像至合适大小.
 77 /// </summary>
 78 /// <param name="image"></param>
 79 /// <param name="size"></param>
 80 /// <returns></returns>
 81 public Image GetFillImage(Image source, Size newSize)
 82 {
 83 var sw = source.Width;
 84 var sh = source.Height;
 85 var tw = newSize.Width;
 86 var th = newSize.Height;
 87 
 88 double wb = sw * 1.0 / tw;
 89 double hb = sh * 1.0 / th;
 90 
 91 Image rt;
 92 Graphics gh;
 93 
 94 //计算目标图像宽高.
 95 if (wb > hb)
 96 {
 97 th = sh;
 98 tw = (int)(tw * hb);
 99 
100 rt = NewBitmap(newSize.Width, newSize.Height, source.HorizontalResolution, source.VerticalResolution);
101 gh = Graphics.FromImage(rt);
102 
103 gh.DrawImage(source, new Rectangle(new Point(0, 0), newSize), new Rectangle(new Point((sw - tw) / 2, 0), new Size(tw, th)), GraphicsUnit.Pixel);
104 gh.Dispose();
105 
106 return rt;
107 }
108 else
109 {
110 //计算出原图中要裁剪的尺寸.
111 tw = sw;
112 th = (int)(th * wb);
113 
114 rt = NewBitmap(newSize.Width, newSize.Height, source.HorizontalResolution, source.VerticalResolution);
115 gh = Graphics.FromImage(rt);
116 
117 gh.DrawImage(source, new Rectangle(0, 0, 100, 100), new Rectangle(30, 30, 100, 100), GraphicsUnit.Pixel);
118 
119 gh.DrawImage(source, new Rectangle(new Point(0, 0), newSize), new Rectangle(new Point(0, (sh - th) / 2), new Size(tw, th)), GraphicsUnit.Pixel);
120 gh.Dispose();
121 
122 return rt;
123 }
124 }
125 
126 /// <summary> 获取图像数据
127 /// </summary>
128 /// <param name="img"></param>
129 /// <returns></returns>
130 public byte[] GetImageData(Image img)
131 {
132 //将图像转化为32位位图 ( 24位计算色差有些麻烦.^^ 32位,则直接转换为整数.)
133 var bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format32bppPArgb);
134 
135 bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);
136 
137 var gh = Graphics.FromImage(bmp);
138 
139 gh.DrawImageUnscaled(img, 0, 0);
140 
141 gh.Save();
142 
143 img = bmp;
144 
145 gh.Dispose();
146 
147 var ms = new MemoryStream(img.Width * img.Height * 4 + 2048);
148 
149 img.Save(ms, ImageFormat.Bmp);
150 ms.Flush();
151 ms.Position = 0;
152 var data = new byte[ms.Length];
153 ms.Read(data, 0, data.Length);
154 ms.Close();
155 return data;
156 }
157 
158 /// <summary> 保存图片 貌似是0 - 100
159 /// </summary>
160 /// <param name="lm"></param>
161 /// <param name="p"></param>
162 /// <param name="fn"> </param>
163 /// <param name="quality"> </param>
164 public void SaveImageToJpeg(Image lm, string fn, int quality)
165 {
166 System.IO.Directory.CreateDirectory(Path.GetDirectoryName(fn));
167 
168 var sm = new FileStream(fn, FileMode.Create);
169 SaveImageToJpeg(lm, sm, quality);
170 sm.Close();
171 }
172 
173 public void SaveImageToJpeg(Image lm, Stream stream, int quality)
174 {
175 if (quality == 0)
176 {
177 quality = 80;
178 }
179 
180 var jgpEncoder = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().First(j => j.FormatID == ImageFormat.Jpeg.Guid);
181 
182 //参数数组
183 var myEncoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
184 
185 //质量
186 var myEncoder = System.Drawing.Imaging.Encoder.Quality;
187 
188 //质量包含参数 
189 //EncoderParameters paramList = Image.FromFile("c:\\http_imgload.jpg").GetEncoderParameterList(jgpEncoder.Clsid);
190 
191 var myEncoderParameter = new System.Drawing.Imaging.EncoderParameter(myEncoder, (Int64)quality);
192 
193 myEncoderParameters.Param[0] = myEncoderParameter;
194 
195 lm.Save(stream, jgpEncoder, myEncoderParameters);
196 stream.Flush();
197 }
198 }

 

以上是关于图像处理的主要内容,如果未能解决你的问题,请参考以下文章

收藏|分享前端开发常用代码片段

处理屏幕旋转上的片段重复(带有示例代码)

关于js----------------分享前端开发常用代码片段

js 常用代码片段

如何从Android片段中的相机获取图像

python常用代码片段总结