原文:C#放缩、截取、合并图片并生成高质量新图的类

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

namespace Framework
{
public class ImageClass
{
        public Image ResourceImage;
        public int Width=0;
        public int Height=0;
        private int ImageWidth;
        private int ImageHeight;
        private ImageFormat imgFormat;
        public string ErrMessage;

public ImageClass(string ImageFileName)
        {
            ResourceImage = Image.FromFile(ImageFileName);
            Width = ResourceImage.Width;
            Height = ResourceImage.Height;
            imgFormat = ResourceImage.RawFormat;
            ErrMessage = "";
        }
        public ImageClass(byte[] Img)
        {
            MemoryStream imgStream = new MemoryStream(Img);
            try
            {
                ResourceImage = System.Drawing.Image.FromStream(imgStream);
                Width = ResourceImage.Width;
                Height = ResourceImage.Height;
                imgFormat = ResourceImage.RawFormat;
            }
            catch (Exception ex)
            {
                ErrMessage = ex.ToString();
            }
        }

public bool ThumbnailCallback()
        {
            return false;
        }

public Image GetReducedImage(int Width, int Height)
        {
            try
            {
                Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);

return ReducedImage;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return null;
            }
        }
        public bool GetReducedImage(int Width, int Height, string targetFilePath)
        {
            try
            {
                EncoderParameter p;
                EncoderParameters ps;

ps = new EncoderParameters(1);

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

Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);

Graphics g = System.Drawing.Graphics.FromImage(ReducedImage);
                // 设置画布的描绘质量
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

//清空画布并以透明背景色填充
                g.Clear(Color.Transparent);

g.DrawImage(ResourceImage, new Rectangle(0, 0, Width, Height), new Rectangle(0, 0, ResourceImage.Width, ResourceImage.Height), GraphicsUnit.Pixel);

ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString());

if (imgCodecInfo == null)
                {
                    ReducedImage.Save(targetFilePath, imgFormat);
                }
                else
                {
                    ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps);
                }

ReducedImage.Dispose();
                g.Dispose();

return true;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return false;
            }
        }

public Image GetReducedImage(double Percent)
        {
            try
            {
                Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
                ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent);

ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);

return ReducedImage;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return null;
            }
        }

public bool GetReducedImage(double Percent, string targetFilePath)
        {
            try
            {
                EncoderParameter p;
                EncoderParameters ps;

ps = new EncoderParameters(1);

p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L);
                ps.Param[0] = p;
                Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
                ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent);

ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);

Graphics g = System.Drawing.Graphics.FromImage(ReducedImage);

// 设置画布的描绘质量
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

//清空画布并以透明背景色填充
                g.Clear(Color.Transparent);

g.DrawImage(ResourceImage, new Rectangle(0, 0, ImageWidth, ImageHeight), new Rectangle(0, 0, ResourceImage.Width, ResourceImage.Height), GraphicsUnit.Pixel);

ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString());

if (imgCodecInfo == null)
                {
                    ReducedImage.Save(targetFilePath, imgFormat);
                }
                else
                {
                    ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps);
                }

ReducedImage.Dispose();
                g.Dispose();

return true;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return false;
            }
        }

public bool GetReducedImage(string targetFilePath)
        {
            try
            {
                ResourceImage.Save(targetFilePath, ImageHelper.GetFormat(targetFilePath));

return true;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return false;
            }
        }

        public bool CaptureImg(string targetFilePath, int width, int height, int spaceX, int spaceY)
        {
            try
            {
                //载入底图  
                int x = 0;   //截取X坐标  
                int y = 0;   //截取Y坐标  
                //原图宽与生成图片宽   之差      
                //当小于0(即原图宽小于要生成的图)时,新图宽度为较小者   即原图宽度   X坐标则为0    
                //当大于0(即原图宽大于要生成的图)时,新图宽度为设置值   即width         X坐标则为   sX与spaceX之间较小者  
                //Y方向同理  
                int sX = ResourceImage.Width - width;
                int sY = ResourceImage.Height - height;
                if (sX > 0)
                {
                    x = sX > spaceX ? spaceX : sX;
                }
                else
                {
                    width = ResourceImage.Width;
                }
                if (sY > 0)
                {
                    y = sY > spaceY ? spaceY : sY;
                }
                else
                {
                    height = ResourceImage.Height;
                }

EncoderParameter p;
                EncoderParameters ps;

ps = new EncoderParameters(1);
                p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L);
                ps.Param[0] = p;

Bitmap ReducedImage = new Bitmap(width, height);
                Graphics g = System.Drawing.Graphics.FromImage(ReducedImage);

// 设置画布的描绘质量
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

//清空画布并以透明背景色填充
                g.Clear(Color.Transparent);

g.DrawImage(ResourceImage, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);

ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString());

if (imgCodecInfo == null)
                {
                    ReducedImage.Save(targetFilePath, imgFormat);
                }
                else
                {
                    ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps);
                }

//释放资源  
                //saveImage.Dispose();
                ReducedImage.Dispose();
                g.Dispose();
            }
            catch (Exception ex)
            {
                ErrMessage = ex.Message;
                return false;
            }
            return true;
        }

public bool MergerImg(string targetFilePath, int ImgWidth, int ImgHeight)
        {
            try
            {
                EncoderParameter p;
                EncoderParameters ps;

ps = new EncoderParameters(1);
                p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L);
                ps.Param[0] = p;

//创建要显示的图片对象,根据参数的个数设置宽度
                Bitmap ReducedImage = new Bitmap(ImgWidth, ImgHeight);
                Graphics g = Graphics.FromImage(ReducedImage);

// 设置画布的描绘质量
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

//清空画布并以透明背景色填充
                g.Clear(Color.Transparent);

int StartX = (ImgWidth - this.Width) / 2;
                int StartY = (ImgHeight - this.Height) / 2;

g.DrawImage(ResourceImage, StartX, StartY, this.Width, this.Height);

//保存图象  
                ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString());
                if (imgCodecInfo == null)
                {
                    ReducedImage.Save(targetFilePath, imgFormat);
                }
                else
                {
                    ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps);
                }

//释放资源  
                ReducedImage.Dispose();
                g.Dispose();
            }
            catch (Exception ex)
            {
                ErrMessage = ex.Message;
                return false;
            }
            return true;
        }

public bool MergerImg(string targetFilePath, System.Drawing.Image image, int ImgWidth, int ImgHeight)
        {
            try
            {
                EncoderParameter p;
                EncoderParameters ps;

ps = new EncoderParameters(1);
                p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L);
                ps.Param[0] = p;

//创建要显示的图片对象,根据参数的个数设置宽度
                Bitmap ReducedImage = new Bitmap(ImgWidth, ImgHeight);
                Graphics g = Graphics.FromImage(ReducedImage);

// 设置画布的描绘质量
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

//清空画布并以透明背景色填充
                g.Clear(Color.Transparent);

int StartX = (ImgWidth - image.Width) / 2;
                int StartY = (ImgHeight - image.Height) / 2;

g.DrawImage(image, StartX, StartY, image.Width, image.Height);
                //保存图象  
                ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString());

if (imgCodecInfo == null)
                {
                    ReducedImage.Save(targetFilePath, imgFormat);
                }
                else
                {
                    ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps);
                }

//释放资源  
                ReducedImage.Dispose();
                g.Dispose();
            }
            catch (Exception ex)
            {
                ErrMessage = ex.Message;
                return false;
            }
            return true;
        }

//返回图片解码器信息用于jpg图片
        private ImageCodecInfo GetCodecInfo(string str)
        {
            string ext = str.Substring(str.LastIndexOf(".") + 1);
            string mimeType = "";
            switch (ext.ToLower())
            {
                case "jpe":
                case "jpg":
                case "jpeg":
                    mimeType = "image/jpeg";
                    break;
                case "bmp":
                    mimeType = "image/bmp";
                    break;
                case "png":
                    mimeType = "image/png";
                    break;
                case "tif":
                case "tiff":
                    mimeType = "image/tiff";
                    break;
                default:
                    mimeType = "image/jpeg";
                    break;
            }
            ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
            foreach (ImageCodecInfo ici in CodecInfo)
            {
                if (ici.MimeType == mimeType) return ici;
            }
            return null;
        }

public void Dispose()
        {
            ResourceImage.Dispose();
        }
}
}

因为tiff格式的图片,一张可以有多页,所以现在有需求如下:

1. 可以随便添加一张图片(tiff,jpeg,png等格式)的图片到指定的tiff图片中去

2. 可以从tiff图片中抽取出任意张图片出来,可以保存为(tiff,png,jpeg等格式)

1   Image img = Image.FromFile("C:\\1.tif");
2   Guid guid = (Guid)img.FrameDimensionsList.GetValue(0);
3   FrameDimension dimension = new FrameDimension(guid);
4   int totalPage = img.GetFrameCount(dimension);
5
6   this.statusBar1.Text = "共"+totalPage+"页";
7
8   for(int i=0;i<totalPage;i++)
9   {
10    img.SelectActiveFrame(dimension,i);
11                img.Save("C:\\Gif"+i+".gif",System.Drawing.Imaging.ImageFormat.Gif);
12   }
13

C#放缩、截取、合并图片并生成高质量新图的类的更多相关文章

  1. atitit.thumb生成高质量缩略图 php .net c++ java

    atitit.java thumb生成高质量缩略图 php .net c++ 1. 图像缩放(image scaling)---平滑度(smoothness)和清晰度(sharpness) 1 2.  ...

  2. C#剪切生成高质量缩放图片

    /// <summary> /// 高质量缩放图片 /// </summary> /// <param name="OriginFilePath"&g ...

  3. Highcharts结合PhantomJS在服务端生成高质量的图表图片

    项目背景 最近忙着给部门开发一套交互式的报表系统,来替换原有的静态报表系统. 老系统是基于dotnetCHARTING开发的,dotnetCHARTING的优势是图表类型丰富,接口调用简单,使用时只需 ...

  4. MPlayer-ww 增加边看边剪切功能+生成高质量GIF功能

    http://pan.baidu.com/s/1eQm5a74 下载FFmpeg palettegen paletteuse documentation 需要下载 FFmpeg2.6 以上 并FFmp ...

  5. <1>Python生成高质量Html文件:Pyh模块+Bootstrap框架

    一,介绍 QQ交流群:585499566 本文的目的是怎么使用Pyh+Bootstrap快速生成简约,大方,清新的Html页面,涉及到的技能:Python小白技能,Pyh会阅读中文文档,Html基础, ...

  6. ASP.NET 画图与图像处理-生成高质量缩略图

    http://www.cftea.com/c/2007/08/SG9WFLZJD62Z2D0O.asp

  7. [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算

    1 前言 略,作为记录使用 2 代码 /** * @Author: FB * @Description: * @File: RotateSample.go * @Version: 1.0.0 * @D ...

  8. PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转

    [强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...

  9. C#一些常用的图片操作方法:生成文字图片 合并图片等

    生成文字图片: /// <summary> /// 生成文字图片 /// </summary> /// <param name="text">& ...

随机推荐

  1. struts2跳转类型解析

    struts 2 跳转类型 1.dispatcher  dispatcher 为默认跳转类型.用于返回一个视图资源 xml代码 : <result name="success" ...

  2. 编译的依赖不能vs的release工程

    前言: 今天,我们正在做一个ocx插件的时候,放到刚装好win7系统的虚拟机上面注冊,弹出以下的一个错误提示: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  3. java验证手机号码是否合法

    公司开发新功能须要验证手机号码,遂自己写了个出来,暂仅仅支持中国大陆手机号验证.如有不妥之处,还望大家指教,感激不尽! /** * 验证是否是正确合法的手机号码 * * @param telephon ...

  4. Java回合阵列List

    package com.mine.practice.arrtolist; import java.util.ArrayList; import java.util.Arrays; import jav ...

  5. Linux Kernel系列 - 黄牛X内核代码凝视

    Hanks.Wang - 专注于操作系统与移动安全研究.Linux-Kernel/SELinux/SEAndroid/TrustZone/Encription/MDM    Mail - byhank ...

  6. hdoj 1506&amp;&amp;1505(City Game) dp

    // l表示从l[i]到i连续大于a[i]的最远左区间.r表示从i到r[i]连续大于a[i]的最远又区间 DP 找出 a[i] 的最远左区间和最远右区间与自己连着的比自己大的数的长度 , 然后用这个长 ...

  7. POJ 2774 后缀数组:查找最长公共子

    思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚 ...

  8. hdu4288 Coder 2012成都网络赛 A题

    题意:往集合里面添加删除数,集合中的数是按从小到大排列的,询问下标模5等于3的数的和. 记得当时这题不会做, 现在想简单多了,只要维护五个值和左右子树的size大小就行了. #define maxn ...

  9. poj3417 Network 树形Dp+LCA

    题意:给定一棵n个节点的树,然后在给定m条边,去掉m条边中的一条和原树中的一条边,使得树至少分为两部分,问有多少种方案. 神题,一点也想不到做法, 首先要分析出加入一条边之后会形成环,形成环的话,如果 ...

  10. zoj2977Strange Billboard (国家压缩+罗列)

    Strange Billboard Time Limit: 2 Seconds Memory Limit: 65536 KB The marketing and public-relations de ...