转至:https://www.cnblogs.com/y114113/p/7641706.html
private void FrmChangeIMG_Load(object sender, EventArgs e)
{
FrmChangeIMG.CheckForIllegalCrossThreadCalls = false;
}
private void button1_Click(object sender, EventArgs e)
{
FolderBrowserDialog folder = new FolderBrowserDialog();
if(folder.ShowDialog()!=DialogResult.OK)
{ return; }
textBox1.Text =folder.SelectedPath;
var foldPath = textBox1.Text.Trim();
if (string.IsNullOrEmpty(foldPath))
{
return;
}
ImageZoomThread(foldPath);
}
private void ImageZoomThread(string foldPath)
{
ThreadStart threadStart = delegate { listBox1.Items.Clear(); ZoomImage(foldPath); };
Thread thread = new Thread(threadStart);
thread.IsBackground = true;
thread.Start();
}
private void ZoomImage(string foldPath)
{
DirectoryInfo dir = new DirectoryInfo(foldPath);
FileInfo[] files = dir.GetFiles("*.jpg");
DirectoryInfo[] dii = dir.GetDirectories();
foreach (var file in files)
{
listBox1.Items.Add(file.FullName);
listBox1.SelectedIndex = -1;
string _filename = file.Name;
string _DirectoryName = file.DirectoryName;
//在_DirectoryName+"\\temp"下生成相同文件名的压缩图片
ChangeImageSize(file.FullName, _DirectoryName + "\\temp", 1);
//生成名称为file.FullName.Replace(".jpg", "_zoom.jpg")的压缩图片
//ChangeImageSize(file.FullName, file.FullName.Replace(".jpg", "_zoom.jpg"),0);
}
获取子文件夹内的子文件列表,递归遍历
//foreach (DirectoryInfo d in dii)
//{
// ZoomImage(d.FullName);
//}
}
#region 压缩图片
/// <summary>
/// 压缩图片
/// </summary>
/// <param name="filePath">要压缩的图片的路径(包含图片名称)</param>
/// <param name="newfilePath">压缩后的图片的路径</param>
/// <param name="newfileType">
///newfileType=0时,newfilePath包含压缩后文件名;
///newfileType=1时,newfilePath只是路径(文件夹,不包含压缩后的图片名称),在路径下生成相同文件名的压缩图片
///</param>
public int ChangeImageSize(string filePath, string newfilePath, int newfileType = 0)
{
//示例
//在_DirectoryName+"\\temp"下生成相同文件名的压缩图片
//ChangeImageSize(file.FullName, _DirectoryName+"\\temp",1);
//生成名称为file.FullName.Replace(".jpg", "_zoom.jpg")的压缩图片
//ChangeImageSize(file.FullName, file.FullName.Replace(".jpg", "_zoom.jpg"), 0);
int result = 0;
try
{
if (!System.IO.File.Exists(filePath))
{
return result;
}
if (newfileType == 1)
{
if (!System.IO.Directory.Exists(newfilePath))
{
System.IO.Directory.CreateDirectory(newfilePath);
}
FileInfo fileinfo = new FileInfo(filePath);
string _filename = fileinfo.Name;
newfilePath = newfilePath + "\\" + _filename;
}
#region
Bitmap bmp = null;
ImageCodecInfo ici = null;
System.Drawing.Imaging.Encoder ecd = null;
EncoderParameter ept = null;
EncoderParameters eptS = null;
ici = this.getImageCoderInfo("image/jpeg");
ecd = System.Drawing.Imaging.Encoder.Quality;
eptS = new EncoderParameters(1);
ept = new EncoderParameter(ecd, 35L);
eptS.Param[0] = ept;
if (File.Exists(newfilePath))
{
File.Delete(newfilePath);
}
bmp = new Bitmap(filePath);
bmp.Save(newfilePath, ici, eptS);
if (bmp != null)
bmp.Dispose();
ept.Dispose();
eptS.Dispose();
#endregion
result++;
}
catch (Exception ex)
{
//throw new Exception(ex.Message);
}
finally
{
}
return result;
}
#endregion
/// <summary>
/// 获取图片编码类型信息
/// </summary>
/// <param name="coderType">编码类型</param>
/// <returns>ImageCodecInfo</returns>
private ImageCodecInfo getImageCoderInfo(string coderType)
{
ImageCodecInfo[] iciS = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo retIci = null;
foreach (ImageCodecInfo ici in iciS)
{
if (ici.MimeType.Equals(coderType))
retIci = ici;
}
return retIci;
}
//-------------------------------
生成缩略图:------------------begin----------------------
private void btn转换分辨率_Click(object sender, EventArgs e)
{
FolderBrowserDialog folder = new FolderBrowserDialog();
if (folder.ShowDialog() != DialogResult.OK)
{ return; }
DirectoryInfo dir = new DirectoryInfo(folder.SelectedPath);
FileInfo[] files = dir.GetFiles("*.jpg");
DirectoryInfo[] dii = dir.GetDirectories();
foreach (var file in files)
{
listBox1.Items.Add(file.FullName);
listBox1.SelectedIndex = -1;
string _filename = file.Name;
string _DirectoryName = file.DirectoryName;
string _Extension = file.Extension;
//在_DirectoryName+"\\temp"下生成相同文件名的缩略图
MakeThumbnail(file.FullName, _DirectoryName + "\\temp", 50,50, "Cut");
}
}
/// <summary>
/// 生成缩略图
/// </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)
{
#region
if(!System.IO.File.Exists(originalImagePath))
{
return;
}
if(!System.IO.Directory.Exists(thumbnailPath))
{
System.IO.Directory.CreateDirectory(thumbnailPath);
}
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
FileInfo _file = new FileInfo(originalImagePath);
thumbnailPath = thumbnailPath + "\\" + _file.Name;
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(towidth, toheight);
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以透明背景色填充
g.Clear(Color.White);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);
try
{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Png);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
#endregion
}
生成缩略图:------------------end----------------------
#region 图片、字节流、Base64间的转换--------begin------------------
/// <summary>
/// 图片转成Base64字符
/// </summary>
/// <param name="img"></param>
/// <returns></returns>
private string ImgToBase64(Image img)
{
byte[] buf = null;
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
buf = ms.GetBuffer();
return Convert.ToBase64String(buf);
}
/// <summary>
/// 将Base64转成图片
/// </summary>
/// <param name="strBase64"></param>
/// <returns></returns>
private Image Base64ToImg(string strBase64)
{
byte[] bt = Convert.FromBase64String(strBase64);
MemoryStream buf = new MemoryStream(bt);
return System.Drawing.Image.FromStream(buf, true);
}
/// <summary>
/// 将图片转成字节流
/// </summary>
/// <param name="img">图片</param>
/// <returns></returns>
private byte[] BitmapToByte(Image img)
{
byte[] buf = null;
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
buf = ms.GetBuffer();
return buf;
}
/// <summary>
/// 将字节流转成图片
/// </summary>
/// <param name="bt">图片字节</param>
/// <returns></returns>
public static System.Drawing.Image ByteToImage(byte[] bt)
{
MemoryStream buf = new MemoryStream(bt);
return System.Drawing.Image.FromStream(buf, true);
}
#endregion ---------------图片、字节流、Base64间的转换--------begin------------------