(Picture)图片加水印,转换格式,生成缩略图操作

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();

        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值