0.
有时候需要一些图片,但是太大了,又有限制,所以想到如何把一张图片的内存大小给缩小,这样就OK了。
1.代码如下:
using System;
using System.Drawing;
using System.Drawing.Imaging;
//这里面有示例文档代码
//https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.imaging.encoderparameter?view=netframework-4.6
namespace WindowsFormsApp1 {
class MyTool {
//根据原图,得到压缩图片并保存在桌面,返回压缩图路径
public static String compressImage(String bmpPath , int quality) {
//原图路径
Bitmap bmp = new Bitmap(bmpPath);
ImageCodecInfo codecInfo = GetEncoder(bmp.RawFormat); //图片编解码信息
System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters encoderParameters = new EncoderParameters(1);
EncoderParameter encoderParameter = new EncoderParameter(encoder , quality);
encoderParameters.Param[0] = encoderParameter; //编码器参数
//压缩图路径
ImageFormat format = bmp.RawFormat;
String newFilePath = String.Empty; //压缩图所在路径
// Guid.NewGuid().ToString()
//GUID 是一个 128 位整数 (16 个字节),它可用于跨所有计算机和网络中,任何唯一标识符是必需的。 此类标识符具有重复的可能性非常小
String deskPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (format.Equals(ImageFormat.Jpeg)) {
newFilePath = deskPath + @"\" + Guid.NewGuid().ToString() + ".jpeg";
}
else if (format.Equals(ImageFormat.Png)) {
newFilePath = deskPath + @"\" + Guid.NewGuid().ToString() + ".png";
}
else if (format.Equals(ImageFormat.Bmp)) {
newFilePath = deskPath + @"\" + Guid.NewGuid().ToString() + ".bmp";
}
else if (format.Equals(ImageFormat.Gif)) {
newFilePath = deskPath + @"\" + Guid.NewGuid().ToString() + ".gif";
}
else if (format.Equals(ImageFormat.Icon)) {
newFilePath = deskPath + @"\" + Guid.NewGuid().ToString() + ".icon";
}
else {
newFilePath = deskPath + @"\" + Guid.NewGuid().ToString() + ".jpg";
}
bmp.Save(newFilePath , codecInfo , encoderParameters); //保存压缩图
return newFilePath; //返回压缩图路径
}
private static ImageCodecInfo GetEncoder(ImageFormat rawFormat) {
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs) {
if (codec.FormatID == rawFormat.Guid) {
return codec;
}
}
return null;
}
}
}
然后调用:
private void button1_Click_1(object sender, EventArgs e) {
using (OpenFileDialog ofd = new OpenFileDialog()) {
ofd.Filter = "图片|*.jpg;*.png;*.gif;*.jpeg;*.bmp";
if (ofd.ShowDialog() == DialogResult.OK) {
String b = MyTool.compressImage(ofd.FileName , 50);
}
}
}
2.结果
我试了把一张大于2M的图片压缩成了400多KB。