C# .net 对图片操作

转载 2007年12月10日 18:39:00
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;
            }


        }

深入.NET平台和C#编程

-
  • 1970年01月01日 08:00

C#图片处理之:在图片上画框(圈)

有时候给别人演示图片,例如培训某个软件使用的时候,往往需要在画面上画个框或者圈,提醒用户注意这是个重点。其实这个功能并不难,只需要知道Pen对象的用法就可以了。我们对框或者圈样式的控制都可以通过对Pe...
  • ki1381
  • ki1381
  • 2007-08-13 13:16:00
  • 8977

C#图片处理之:色彩调整

上面有一篇提到了图片明暗的调整,其原理是每个象素的三个颜色分量同时增加或减少一个固定的值。现在更进一步,假如每个象素三个分量增加或减少的值不是相同的呢?嗯,这就今天要讨论的主题了。应该很容易想明白,假...
  • ki1381
  • ki1381
  • 2007-04-25 18:58:00
  • 6186

C#添加图片资源

1、在项目目录下创建Resources文件夹,把需要用到的图片放到此文件夹里 2、在项目属性-资源里面添加这些图片 此时就可以在项目里看到资源文件夹及其下的图片了 3、在代码里这样使用这...
  • wzj0808
  • wzj0808
  • 2018-01-05 16:49:54
  • 333

C#图片处理

  • 2017年08月30日 09:44
  • 56KB
  • 下载

C# 图片的裁剪,两个图片合成一个图片

图片裁剪,生成新图,保存在同一目录下
  • FairyStepWGL
  • FairyStepWGL
  • 2017-02-04 17:05:27
  • 3320

C#开发COM组件

1.    概述       Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用以及...
  • soudog
  • soudog
  • 2007-04-30 15:18:00
  • 11827

C#与.NET 的关系

C#本身是一门语言,他是用于生成面向.NET 环境的代码,但其并不是.NET 的一部分。换言 之,C#编写 的代码总是运行在.NET Framework 中。而且,在很多时候,C#的特定功能依赖 ...
  • chh19941125
  • chh19941125
  • 2015-02-18 10:56:14
  • 1261

C#.net_经典编程例子400个

  • 2013年05月17日 09:25
  • 2.79MB
  • 下载

C#版本和.NET版本以及VS版本的对应关系

之所以在这里分享这个对应关系,是因为在C#基础知识系列的文章发布之后,有些初学者对.NET版本和C#语言特性之间的对应关系有点不清楚,有时候会弄混淆了。并且通过这个对应关系,也可以帮助大家对C#和.N...
  • WuLex
  • WuLex
  • 2017-06-20 16:07:02
  • 5373
收藏助手
不良信息举报
您举报文章:C# .net 对图片操作
举报原因:
原因补充:

(最多只允许输入30个字)