C# .net 对图片操作

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public class ImageHelper
{
    /// <summary>
    /// 获取图片中的各帧
    /// </summary>
    /// <param name="pPath">图片路径</param>
    /// <param name="pSavePath">保存路径</param>
    public void GetFrames(string pPath, string pSavedPath)
    {
        Image gif = Image.FromFile(pPath);
        FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]);

        //获取帧数(gif图片可能包含多帧,其它格式图片一般仅一帧)
        int count = gif.GetFrameCount(fd);

        //以Jpeg格式保存各帧
        for (int i = 0; i < count; i++)
        {
            gif.SelectActiveFrame(fd, i);
            gif.Save(pSavedPath + "//frame_" + i + ".jpg", ImageFormat.Jpeg);
        }
    }

    /// <summary>
    /// 获取图片缩略图
    /// </summary>
    /// <param name="pPath">图片路径</param>
    /// <param name="pSavePath">保存路径</param>
    /// <param name="pWidth">缩略图宽度</param>
    /// <param name="pHeight">缩略图高度</param>
    /// <param name="pFormat">保存格式,通常可以是jpeg</param>
    public void GetSmaller(string pPath, string pSavedPath, int pWidth, int pHeight)
    {
        try
        {
            Image smallerImg;
            Image originalImg = Image.FromFile(pPath);
            Image.GetThumbnailImageAbort callback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
            smallerImg = originalImg.GetThumbnailImage(pWidth, pHeight, callback, IntPtr.Zero);
            smallerImg.Save(pSavedPath + "//smaller.jpg", ImageFormat.Jpeg);
        }
        catch (Exception x)
        {
            //
        }
    }

    /// <summary>
    /// 获取图片指定部分
    /// </summary>
    /// <param name="pPath">图片路径</param>
    /// <param name="pSavePath">保存路径</param>
    /// <param name="pPartStartPointX">目标图片开始绘制处的坐标X值(通常为)</param>
    /// <param name="pPartStartPointY">目标图片开始绘制处的坐标Y值(通常为)</param>
    /// <param name="pPartWidth">目标图片的宽度</param>
    /// <param name="pPartHeight">目标图片的高度</param>
    /// <param name="pOrigStartPointX">原始图片开始截取处的坐标X值</param>
    /// <param name="pOrigStartPointY">原始图片开始截取处的坐标Y值</param>
    /// <param name="pFormat">保存格式,通常可以是jpeg</param>
    public void GetPart(string pPath, string pSavedPath, int pPartStartPointX, int pPartStartPointY, int pPartWidth, int pPartHeight, int pOrigStartPointX, int pOrigStartPointY)
    {
        Image originalImg = Image.FromFile(pPath);

        Bitmap partImg = new Bitmap(pPartWidth, pPartHeight);
        Graphics graphics = Graphics.FromImage(partImg);
        Rectangle destRect = new Rectangle(new Point(pPartStartPointX, pPartStartPointY), new Size(pPartWidth, pPartHeight));//目标位置
        Rectangle origRect = new Rectangle(new Point(pOrigStartPointX, pOrigStartPointY), new Size(pPartWidth, pPartHeight));//原图位置(默认从原图中截取的图片大小等于目标图片的大小)

        graphics.DrawImage(originalImg, destRect, origRect, GraphicsUnit.Pixel);
        partImg.Save(pSavedPath + "//part.jpg", ImageFormat.Jpeg);
    }

    public bool ThumbnailCallback()
    {
        return false;
    }
}

 //********************************************************************************************C#对图片的几种简单处理

#region 生成缩略图
        public void MakeSmallImg(string filePath, string saveImg)
        {
            //从文件取得图片对象
            System.Drawing.Image image = System.Drawing.Image.FromFile(filePath, true);

           

            //取得图片大小
            System.Drawing.Size size = new System.Drawing.Size((int)image.Width, (int)image.Height);
            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(size.Width, size.Height);
            //新建一个画板
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default;
            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
            //清空一下画布
            g.Clear(System.Drawing.Color.White);
            //在指定位置画图
            g.DrawImage(image, new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
                new System.Drawing.Rectangle(0, 0, image.Width, image.Height),
                System.Drawing.GraphicsUnit.Pixel);


            ///文字水印
            //System.Drawing.Graphics G=System.Drawing.Graphics.FromImage(bitmap);
            //System.Drawing.Font f=new Font("宋体",10);
            //System.Drawing.Brush b=new SolidBrush(Color.Black);
            //G.DrawString("myohmine",f,b,10,10);
            //G.Dispose();

 

            ///图片水印
            //System.Drawing.Image copyImage = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath("pic/1.gif"));
            //Graphics a = Graphics.FromImage(bitmap);
            //a.DrawImage(copyImage, new Rectangle(bitmap.Width-copyImage.Width,bitmap.Height-copyImage.Height,copyImage.Width, copyImage.Height),0,0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);

            //copyImage.Dispose();
            //a.Dispose();
            //copyImage.Dispose();


            //保存高清晰度的缩略图
            //   bitmap.Save(strGoodFile, System.Drawing.Imaging.ImageFormat.Jpeg);
            //   加个a表示是缩略图
            bitmap.Save(saveImg, System.Drawing.Imaging.ImageFormat.Jpeg);
            g.Dispose();
            image.Dispose();
            bitmap.Dispose();
        }
        #endregion

//****************************************************************************************关于图片处理方法(C#)

处理图片时常用的过程是:读入图片文件并转化为Bitmap -> 处理此Bitmap的每个点以得到需要的效果 -> 保存新的Bitmap到文件
使用C#很方便的就可以把多种格式的图片文件读到Bitmap对象中。一句话就够了,常见的格式都支持,诸如JPEG,BMP,PNG等等。

Bitmap bmp = new Bitmap("文件名");

然后就是怎么处理这个图片的问题了,与本案无关,pass。

最后就是保存。JPEG虽然是有损压缩方案,但是它在缩减文件体积和尽可能好的保留原有信息的矛盾上很好的找到了平衡点,所以在很多情况下成为首选的保存方案。

C#当然不会无视这一点,Bitmap类提供了默认的另存为JPEG的方法:

bmp.Save("输出文件", System.Drawing.Imaging.ImageFormat.Jpeg);

这样当然很方便,但有时候更在乎文件体积而有时候更在乎图像质量,是不是有什么办法可以让自己来控制压缩质量呢?

答案是肯定的,bmp.Save方法中有个重载用到了EncoderParameters参数。我们可以在这个参数中加入自己的控制质量。


        
/// <summary>
        
/// 保存JPG时用
        
/// </summary>
        
/// <param name="mimeType"></param>
        
/// <returns>得到指定mimeType的ImageCodecInfo</returns>

        private static ImageCodecInfo GetCodecInfo(string mimeType)
        
{
            ImageCodecInfo[] CodecInfo 
= ImageCodecInfo.GetImageEncoders();
            
foreach (ImageCodecInfo ici in CodecInfo)
            
{
                
if (ici.MimeType == mimeType) return ici;
            }

            
return null;
        }



        
/// <summary>
        
/// 保存为JPEG格式,支持压缩质量选项
        
/// </summary>
        
/// <param name="bmp"></param>
        
/// <param name="FileName"></param>
        
/// <param name="Qty"></param>
        
/// <returns></returns>

        public static bool KiSaveAsJPEG(Bitmap bmp, string FileName, int Qty)
        
{
            
try
            
{
                EncoderParameter p;
                EncoderParameters ps;

                ps 
= new EncoderParameters(1);

                p 
= new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qty);
                ps.Param[
0= p;

                bmp.Save(FileName, GetCodecInfo(
"image/jpeg"), ps);
                
                
return true;
            }

            
catch
            
{
                
return false;
            }


        }
阅读更多

没有更多推荐了,返回首页