using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
/*
---使用Image、Graphics对象可以读取图像文件、加水印、格式转换及生成缩略图。
本节代码需引用命名空间System.Drawing.Drawing2D和System.Drawing.Imaging.
---图像文件主要有BMP、GIF、JPEG、PNG等格式,
BMP是标准的Windows图像格式;
GIF格式可用于做动画图像;
JPEG是压缩率最高的格式,适合彩色图像;
PNG格式的图标在网页或Windows控件中可呈现透明背景的效果,程序或网页小图标
建议使用PNG格式。
*/
namespace ImageFileOperation
{
public partial class Form1 : Form
{
private string fileName = string.Empty;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 选择一张图片
/// </summary>this.pictureBox1.Refresh();????????????????????????怎么用
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSelImage_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
//设定对话框初始路径
ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
//设置筛选器
ofd.Filter = "图像文件|*.bmp;*.jpg;*.png;*.gif;*.jpeg";
//设置标题
ofd.Title = "选择一张图片加载";
//多选禁止
ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK)
{
this.fileName = this.textBox1.Text = ofd.FileName;
//加载到pictureBox控件
//使用Image.FromFile()加载本地图片
Image img = Image.FromFile(this.textBox1.Text);
Bitmap bmp = new Bitmap(img);
img.Dispose(); img = null;
this.pictureBox1.Image = bmp;
/*https://www.bbsmax.com/A/MyJxax4X5n/
使用Image.FromFile取磁盘上的图片时,这个方法会锁定图片文件,而且会导致内存占用增大, 有几种方法解决:
一:将Image类转换成Bitmap类
System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
img.Dispose();
然后使用 bmp作为PictureBox的图片源
二:从流中读取
FileStream fileStream = new FileStream("文件名", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
原因:一个图像对象从一个文件构造时该文件仍保留锁定对象的生存期。所以关键是要使用 Graphics.DrawImage()方法或Drawing.Bitmap()
方法来将映像复制到新位图Bitmap对象,然后Bitmap和Graphics就可以释放了。或者用使用FileStream的方式将文件读成流。
*/
MessageBox.Show("加载完成!"); //加上这句就可以将bmp释放掉了,不加提示错误。
bmp.Dispose();bmp = null;
}
}
/// <summary>
/// 添加水印并保存图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSaveImage_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(fileName);
//创建一个Bitmap对象
Bitmap bmp = new Bitmap(img);
//及时销毁img
img.Dispose(); img = null;
//从bmp创建一个Graphics对象 用于绘图
Graphics graphics = Graphics.FromImage(bmp);
//指定在缩放或旋转图像时使用的算法
//使用高质量的双线性插值法,执行预筛选以确保高质量的收缩
//设置插补模式,需引用System.Drawing.Drawing2D
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
//定义单色画笔,用于填充图形形状,如矩形、椭圆、扇形、多边形和封闭路径
SolidBrush brush = new SolidBrush(Color.Red);
//定义起始位置
PointF P = new PointF(250, 300);
//定义字体
Font font = new Font("微软雅黑",40);
//绘制字符
graphics.DrawString(this.textBox2.Text,font,brush,P);
//以JPEG格式保存图像文件
//System.Drawing.Imaging
//使用Bitmap.Save()方法对图片格式进行转换的过程,新的文件扩展名必须与ImageFormat格式一致
if (Path.GetExtension(this.fileName) == ".jpg")//若加载的文件名和保存的文件名相同会保存错误
{
//将原来文件删除后保存
File.Delete(this.fileName);
bmp.Save(this.fileName, ImageFormat.Jpeg);
}
else
bmp.Save(this.fileName.Replace(Path.GetExtension(this.fileName), ".jpg"), ImageFormat.Jpeg);
//销毁对象
font.Dispose();font = null;
graphics.Dispose(); graphics = null;
this.pictureBox1.Image = bmp;
MessageBox.Show("保存成功!");
bmp.Dispose(); bmp = null;
}
/// <summary>
/// 保存为Gif格式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGifFormat_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(this.fileName);
Bitmap bmp = new Bitmap(img);
img.Dispose(); img = null;
//使用Bitmap.Save()方法对图片格式进行转换的过程,新的文件扩展名必须与ImageFormat格式一致
if (Path.GetExtension(this.fileName) == ".gif")//若加载的文件名和保存的文件名相同会保存错误
{
//不需转换
MessageBox.Show("图片是GIF格式,不需转换。");
}
else
{
bmp.Save(this.fileName.Replace(Path.GetExtension(this.fileName), ".gif"), ImageFormat.Gif);
MessageBox.Show("保存成功!");
}
bmp.Dispose();bmp = null;
}
/// <summary>
/// 保存为Png格式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPngFormat_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(this.fileName);
Bitmap bmp = new Bitmap(img);
img.Dispose(); img = null;
//使用Bitmap.Save()方法对图片格式进行转换的过程,新的文件扩展名必须与ImageFormat格式一致
if (Path.GetExtension(this.fileName) == ".png")//若加载的文件名和保存的文件名相同会保存错误
{
//不需转换
MessageBox.Show("图片是PNG格式,不需转换。");
}
else
{
bmp.Save(this.fileName.Replace(Path.GetExtension(this.fileName), ".png"), ImageFormat.Png);
MessageBox.Show("保存成功!");
}
bmp.Dispose(); bmp = null;
}
/// <summary>
/// 保存为Bmp格式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnBmpFormat_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(this.fileName);
Bitmap bmp = new Bitmap(img);
img.Dispose(); img = null;
//使用Bitmap.Save()方法对图片格式进行转换的过程,新的文件扩展名必须与ImageFormat格式一致
if (Path.GetExtension(this.fileName) == ".bmp")//若加载的文件名和保存的文件名相同会保存错误
{
//不需转换
MessageBox.Show("图片是BMP格式,不需转换。");
}
else
{
bmp.Save(this.fileName.Replace(Path.GetExtension(this.fileName), ".bmp"), ImageFormat.Bmp);
MessageBox.Show("保存成功!");
}
bmp.Dispose(); bmp = null;
}
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnThumb_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(this.fileName);
//创建缩略图,指定宽度和长度
//提供一个回调方法,用于确定GetThumbnailImage方法应在何时提前取消执行
Image thumbnailImage = img.GetThumbnailImage(100, 100, new Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero);
img.Dispose(); img = null;
//以jpg保存
//判断后缀名是否需要改变
if (Path.GetExtension(this.fileName) != ".jpg") //不能保存为同名的。如打开的image为a.jpg,保存缩略图为a.jpg是不可以的。
thumbnailImage.Save(this.fileName.Replace(Path.GetExtension(this.fileName), ".jpg"), ImageFormat.Jpeg);
else
{
thumbnailImage.Save(Path.GetDirectoryName(this.fileName) + "\\thumb.jpg", ImageFormat.Jpeg);
}
thumbnailImage.Dispose(); thumbnailImage = null;
MessageBox.Show("生成成功!");
}
private bool ThumbnailCallback()
{
return true;
}
/// <summary>
/// 保存为JPG格式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnJpgFormat_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(this.fileName);
Bitmap bmp = new Bitmap(img);
img.Dispose();img = null;
//使用Bitmap.Save()方法对图片格式进行转换的过程,新的文件扩展名必须与ImageFormat格式一致
if (Path.GetExtension(this.fileName) == ".jpg")//若加载的文件名和保存的文件名相同会保存错误
{
//不需转换
MessageBox.Show("图片是JPG格式,不需转换。");
}
else
{
bmp.Save(this.fileName.Replace(Path.GetExtension(this.fileName), ".jpg"), ImageFormat.Jpeg);
MessageBox.Show("保存成功!");
}
bmp.Dispose(); bmp = null;
}
}
}
C#路径中获取文件全路径、目录、扩展名、文件名称的方法
见下图
class Program
{
static void Main(string[] args)
{
//获取当前运行程序的目录
string fileDir = Environment.CurrentDirectory;
Console.WriteLine("当前程序目录:"+fileDir);
//一个文件目录
string filePath = "C:\\JiYF\\BenXH\\BenXHCMS.xml";
Console.WriteLine("该文件的目录:"+filePath);
string str = "获取文件的全路径:" + Path.GetFullPath(filePath); //-->C:\JiYF\BenXH\BenXHCMS.xml
Console.WriteLine(str);
str = "获取文件所在的目录:" + Path.GetDirectoryName(filePath); //-->C:\JiYF\BenXH
Console.WriteLine(str);
str = "获取文件的名称含有后缀:" + Path.GetFileName(filePath); //-->BenXHCMS.xml
Console.WriteLine(str);
str = "获取文件的名称没有后缀:" + Path.GetFileNameWithoutExtension(filePath); //-->BenXHCMS
Console.WriteLine(str);
str = "获取路径的后缀扩展名称:" + Path.GetExtension(filePath); //-->.xml
Console.WriteLine(str);
str = "获取路径的根目录:" + Path.GetPathRoot(filePath); //-->C:\
Console.WriteLine(str);
Console.ReadKey();
}
}