using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
namespace Core.StlMes.Client.LgResMgt.Mcms
{
///
/// 图片处理类
/// 1、生成缩略图片或按照比例改变图片的大小和画质
/// 2、将生成的缩略图放到指定的目录下
///
public class ImageZip
{
public Image ResourceImage, ReducedImage;
private int ImageWidth;
private int ImageHeight;
public string ErrMessage;
///
/// 类的构造函数
///
/// 图片文件的全路径名称
public ImageZip()
{
//ResourceImage = Image.FromFile(ImageFileName);
ErrMessage = "";
}
///
/// 类的构造函数
///
/// 图片文件的全路径名称
public ImageZip(string ImageFileName)
{
ResourceImage = Image.FromFile(ImageFileName);
ErrMessage = "";
}
public bool ThumbnailCallback()
{
return false;
}
///
/// 生成缩略图,返回缩略图的Image对象
///
/// 缩略图的宽度
/// 缩略图的高度
/// 缩略图的Image对象
public Image GetReducedImage(int Width, int Height)
{
double LengthLong; //存储(长和宽中)较短的长度
int widthOK, heightOK; //存储实际要生成的图片的长宽
if (Width < Height) //判断输入的长和宽那个较短
{
LengthLong = Width; //把较短的存储在 LengthLonh 用于计算
}
else
{
LengthLong = Height;
}
try
{
//判断原图片 长和宽
//原图比较长的一个边要和缩略图的边相等
if (ResourceImage.Width > ResourceImage.Height)
{
widthOK = (int)LengthLong;
heightOK = (int)(LengthLong / ResourceImage.Width * ResourceImage.Height);
}
else
{
heightOK = (int)LengthLong;
widthOK = (int)LengthLong / ResourceImage.Height * ResourceImage.Width;
}
Image ReducedImage;
Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
ReducedImage = ResourceImage.GetThumbnailImage(widthOK, heightOK, callb, IntPtr.Zero);
return ReducedImage;
}
catch (Exception e)
{
ErrMessage = e.Message;
return null;
}
}
///
/// 生成缩略图,将缩略图文件保存到指定的路径
///
/// 缩略图的宽度
/// 缩略图的高度
/// 缩略图保存的全文件名,(带路径),参数格式:D:\Images\filename.jpg
/// 成功返回true,否则返回false
public bool GetReducedImage(int Width, int Height, string targetFilePath)
{
double LengthLong; //存储(长和宽中)较短的长度
int widthOK, heightOK; //存储实际要生成的图片的长宽
if (Width < Height) //判断输入的长和宽那个较短
{
LengthLong = Width; //把较短的存储在 LengthLonh 用于计算
}
else
{
LengthLong = Height;
}
try
{
//判断原图片 长和宽
//原图比较长的一个边要和缩略图的边相等
if (ResourceImage.Width > ResourceImage.Height)
{
widthOK = (int)LengthLong;
heightOK = (int)(LengthLong / ResourceImage.Width * ResourceImage.Height);
}
else
{
heightOK = (int)LengthLong;
widthOK = (int)LengthLong / ResourceImage.Height * ResourceImage.Width;
}
Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
ReducedImage = ResourceImage.GetThumbnailImage(widthOK, heightOK, callb, IntPtr.Zero);
ReducedImage.Save(@targetFilePath,ImageFormat.Jpeg);
ReducedImage.Dispose();
return true;
}
catch (Exception e)
{
ErrMessage = e.Message; //e.ToString();
return false;
}
}
///
/// 生成缩略图,返回缩略图的Image对象
///
/// 缩略图的宽度百分比 如:需要百分之80,就填0.8
/// 缩略图的Image对象
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.Width * Percent);
ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
return ReducedImage;
}
catch (Exception e)
{
ErrMessage = e.Message;
return null;
}
}
///
/// 生成缩略图,返回缩略图的Image对象
///
/// 缩略图的宽度百分比 如:需要百分之80,就填0.8
/// 缩略图保存的全文件名,(带路径),参数格式:D:\Images\filename.jpg
/// 成功返回true,否则返回false
public bool GetReducedImage(double Percent, string targetFilePath)
{
try
{
Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent);
ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);
//ReducedImage.Dispose();
return true;
}
catch (Exception e)
{
ErrMessage = e.Message;
return false;
}
}
///
/// 图像保存转化为数组
///
/// 传入图像文件名称
///
public static byte[] ZipImageByte(string strImagePath)
{
try
{
long Dest_Size = 55296;
Bitmap img = null;
if (System.IO.File.Exists(strImagePath))
{
img = new Bitmap(strImagePath);
}
else
{
return new byte[1];
}
MemoryStream bmpStream = new MemoryStream();
img.Save(bmpStream, System.Drawing.Imaging.ImageFormat.Jpeg);
if (bmpStream.ToArray().Length < Dest_Size)
{
img.Dispose();
return bmpStream.ToArray();
}
else
{
ImageFormat __format;
System.Drawing.Imaging.Encoder __encoder;
EncoderParameter __encoderParameter;
EncoderParameters __encoderParameters;
ImageCodecInfo __imageCodecInfo;
__imageCodecInfo = DoGetEncoderInfo("image/jpeg");
__encoder = System.Drawing.Imaging.Encoder.Quality;
__encoderParameters = new EncoderParameters(1);
long dLevel = 40L;
long Len = Dest_Size;
/*
do
{
if (dLevel > 15)
{
dLevel -= 5;
}
else
{
dLevel -= 1;
}
__encoderParameter = new EncoderParameter(__encoder, dLevel); //图片质量
__encoderParameters.Param[0] = __encoderParameter;
__format = ImageFormat.Jpeg;
bmpStream = new MemoryStream();
img.Save(bmpStream, __imageCodecInfo, __encoderParameters);
Len = bmpStream.ToArray().Length;
if (Len <= Dest_Size) break;
} while (dLevel > 0);
//*/
__encoderParameter = new EncoderParameter(__encoder, dLevel); //图片质量
__encoderParameters.Param[0] = __encoderParameter;
bmpStream = new MemoryStream();
img.Save(bmpStream, __imageCodecInfo, __encoderParameters);
Len = bmpStream.ToArray().Length;
img.Dispose();
return bmpStream.ToArray();
}
}
catch (Exception exp)
{
Debug.Print(exp.Message);
return new byte[1];
}
}
///
/// 获取图片文件的编码与解码
///
///
///
public static ImageCodecInfo DoGetEncoderInfo(string MYmimeType)
{
int i = 0;
System.Drawing.Imaging.ImageCodecInfo[] encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
for (i = 0; i < encoders.Length; i++)
{
if (encoders[i].MimeType == MYmimeType)
{
return encoders[i];
}
}
return null;
}
///
/// 二进制转换成图片
///
/// 二进制数组
///
public static Bitmap BytesToBitmap(byte[] Bytes)
{
if (Bytes.Length == 0 || Bytes.Length == 1)
{
return null;
}
try
{
MemoryStream ImageMem = new MemoryStream(Bytes, true);
ImageMem.Write(Bytes, 0, Bytes.Length);
Bitmap _Image = new Bitmap(ImageMem);
return _Image;
}
catch (Exception ex)
{
Debug.Print(ex.Message);
return null;
}
}
}
}