using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using ZXing;
namespace AllBase
{
public class ImageCut
{
///
/// 正方型裁剪
/// 以图片中心为轴心,截取正方型,然后等比缩放
/// 用于头像处理
///
/// 吴剑 2010-11-23
/// 原图HttpPostedFile对象
/// 缩略图存放地址
/// 指定的边长(正方型)
/// 质量(范围0-100)
public static void CutForSquare(string path, string fileSaveUrl, int side, int quality, out int width,
out int height)
{
string exe = path.Split('.')[path.Split('.').Length - 1].ToLower();
Image initImage = null;
width = 0;
height = 0;
try
{
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
initImage = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
}
catch (Exception e)
{
LogSave.Add(e.Message);
return;
}
width = initImage.Width;
height = initImage.Height;
//原图宽高均小于模版,不作处理,直接保存
if (initImage.Width <= side || initImage.Height <= side)
{
return;
//initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
}
//关键质量控制
//获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null, defCodecInfo = null;
foreach (ImageCodecInfo i in icis)
{
if (i.MimeType == "image/jpeg")
defCodecInfo = i;
if ((exe == "jpg" || exe == "jpeg") && i.MimeType == "image/jpeg")
{
ici = i;
}
if (exe == "bmp" && i.MimeType == "image/bmp")
{
ici = i;
}
if (exe == "png" && i.MimeType == "image/png")
{
ici = i;
}
if (exe == "gif" && i.MimeType == "image/gif")
{
ici = i;
}
}
if (ici == null)
ici = defCodecInfo;
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
//原始图片的宽、高
int initWidth = initImage.Width;
int initHeight = initImage.Height;
int sizeW = 50, sizeH = 50;
if (initWidth > initHeight)
sizeW = 70;
else
sizeH = 70;
width = initWidth - sizeW * 2;
height = initHeight - sizeH * 2;
//FileBase.Delete(path);
Image pickedImage = new Bitmap(width, height);
Graphics pickedG = Graphics.FromImage(pickedImage);
pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
//定位
Rectangle fromR = new Rectangle(sizeW - 20, sizeH, width, height);
Rectangle toR = new Rectangle(0, 0, width, height);
//画图
pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
//将截图对象赋给原图
Image initImagex = (System.Drawing.Image)pickedImage.Clone();
//释放截图资源
pickedG.Dispose();
pickedImage.Dispose();
initImage.Clone();
initImage.Dispose();
try
{
initImagex.Save(fileSaveUrl, ici, ep);
}
catch (Exception e)
{
LogSave.Add(e.Message);
}
//释放关键质量控制所用资源
ep.Dispose();
}
///
/// 是否二维码
///
///
///
public static bool GetErWeiMa(string strSavePath)
{
BarcodeReader reader = new BarcodeReader();
FileStream fileStream = new FileStream(strSavePath, FileMode.Open, FileAccess.Read);
try
{
Image initImage = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
if (initImage.Width < 10 || initImage.Height < 10)
return false;
Result result = reader.Decode((Bitmap)initImage);
if (result == null || string.IsNullOrEmpty(result.Text))
return false;
}
catch
{
return false;
}
FileBase.Delete(strSavePath);
return true;
//return result.Text;
}
///
/// 是否二维码
///
///
///
public static bool GetErWeiMa(byte[] file, out int width, out int height)
{
width = 0;
height = 0;
try
{
MemoryStream ms = new MemoryStream(file);
Image initImage = Image.FromStream(ms);
ms.Close();
width = initImage.Width;
height = initImage.Height;
if (initImage.Width < 10 || initImage.Height < 10)
{
initImage = null;
return false;
}
BarcodeReader reader = new BarcodeReader();
Result result = reader.Decode((Bitmap)initImage);
if (result == null || string.IsNullOrEmpty(result.Text))
{
reader = null;
result = null;
initImage = null;
return false;
}
reader = null;
result = null;
initImage = null;
}
catch
{
return false;
}
return true;
//return result.Text;
}
///
/// 正方型裁剪
/// 以图片中心为轴心,截取正方型,然后等比缩放
/// 用于头像处理
///
/// 吴剑 2010-11-23
/// 原图HttpPostedFile对象
/// 缩略图存放地址
/// 指定的边长(正方型)
/// 质量(范围0-100)
public static void CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int side, int quality)
{
//创建目录
string dir = Path.GetDirectoryName(fileSaveUrl);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
//原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
//原图宽高均小于模版,不作处理,直接保存
if (initImage.Width <= side && initImage.Height <= side)
{
initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
}
else
{
//原始图片的宽、高
int initWidth = initImage.Width;
int initHeight = initImage.Height;
//非正方型先裁剪为正方型
if (initWidth != initHeight)
{
//截图对象
System.Drawing.Image pickedImage = null;
System.Drawing.Graphics pickedG = null;
//宽大于高的横图
if (initWidth > initHeight)
{
//对象实例化
pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
//设置质量
pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//定位
Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
//画图
pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
//重置宽
initWidth = initHeight;
}
//高大于宽的竖图
else
{
//对象实例化
pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
//设置质量
pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//定位
Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
//画图
pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
//重置高
initHeight = initWidth;
}
//将截图对象赋给原图
initImage = (System.Drawing.Image)pickedImage.Clone();
//释放截图资源
pickedG.Dispose();
pickedImage.Dispose();
}
//缩略图对象
System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
//设置质量
resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//用指定背景色清空画布
resultG.Clear(Color.White);
//绘制缩略图
resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
//关键质量控制
//获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo i in icis)
{
if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
{
ici = i;
}
}
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
//保存缩略图
resultImage.Save(fileSaveUrl, ici, ep);
//释放关键质量控制所用资源
ep.Dispose();
//释放缩略图资源
resultG.Dispose();
resultImage.Dispose();
//释放原始图片资源
initImage.Dispose();
}
}
///
/// 判断文件类型是否为WEB格式图片
/// (注:JPG,GIF,BMP,PNG)
///
/// HttpPostedFile.ContentType
///
public static bool IsWebImage(string contentType)
{
if (contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmp" || contentType == "image/png")
{
return true;
}
else
{
return false;
}
}
///
/// 压缩图片获得图片MD5 32位指纹
///
///
///
///
///
public static long ResizeImage(Image imgToResize, int width, int height)
{
try
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)width / (float)sourceWidth);
nPercentH = ((float)height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage(b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
imgToResize.Dispose();
long md5 = ToGray(ref b, width, height);
return md5;
}
catch (Exception e)
{
LogSave.Add("计算图片指纹失败:"+e.Message);
return 0;
}
}
///
/// 图像灰度化,并计算指纹
///
///
///
public static long ToGray(ref Bitmap bmp, int width, int height)
{
byte[] b = new byte[width * height];
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
Color color = bmp.GetPixel(i, j);
int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
gray = gray / 16;
b[i * bmp.Width + j] = (byte)gray;
}
}
return BaseClass.GetLong(b);
}
///
/// 处理图片(四边裁剪+水印)
///
///
///
///
public static void HandleImage(ref byte[] bytesOld,bool flag)
{
try
{
Image img = BytesToImage(ref bytesOld);
int iniWidth = img.Width;
int iniHeight = img.Height;
Random random = new Random();
int cutPixl = random.Next(1, 50); //左边切除的像素
int cutPixr = random.Next(1, 50); //右边切除的像素
int cutPixt = random.Next(1, 50); //顶部切除的像素
int cutPixb = random.Next(1, 50); //底部切除的像素
if (!flag)
{
cutPixl = 0; //左边切除的像素
cutPixr = 0; //右边切除的像素
cutPixt = 0; //顶部切除的像素
cutPixb = 0; //底部切除的像素
}
Bitmap bitmap = CutImage(ref bytesOld, cutPixl, cutPixr, iniWidth - cutPixl - cutPixt, iniHeight - cutPixr - cutPixb);
if(bitmap==null)
return;
MemoryStream ms = new MemoryStream();
ImageCodecInfo icc = GetEncoderInfo("image/jpeg");
EncoderParameters ep = new EncoderParameters(1)
{
Param = { [0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 75l) }
};
bitmap.Save(ms, icc, ep);
bytesOld = ms.ToArray();
}
catch
{
}
}
///
/// 字节数组转换为图片
///
/// 字节数组
/// 图片
public static Image BytesToImage(ref byte[] buffer)
{
var ms = new MemoryStream(buffer, 0, buffer.Length);
return Image.FromStream(ms);
}
///
/// 裁剪图片四边
///
/// 原始图片字节流
/// 裁剪开始x坐标
/// 裁剪开始y坐标
/// 裁剪宽度
/// 裁剪高度
///
public static Bitmap CutImage(ref byte[] bytes, int iStartX, int iStartY, int iWidth, int iHeight)
{
try
{
Image image = BytesToImage(ref bytes);
Bitmap b = new Bitmap(image);
if (bytes == null) return null;
Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bmpOut);
g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(iStartX, iStartY, iWidth, iHeight), GraphicsUnit.Pixel);
g.Dispose();
return bmpOut;
}
catch
{
return null;
}
}
public static ImageCodecInfo GetEncoderInfo(string mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
}
}