图片生成缩略图会有旋转角度

/// <summary>
/// 测试JRE图片压缩后图片会旋转问题
/// </summary>
public void Uploadimg1()
{
HttpPostedFile hpf = HttpContext.Current.Request.Files[];
var context = HttpContext.Current;
string newurl = context.Server.MapPath("/upload/img/" + DateTime.Now.ToString("yyyyMM") + "/");
string newfilename = hpf.FileName;
hpf.SaveAs(newurl + "_" + newfilename);
hpf.SaveAs(newurl + newfilename);
JREUpLoadImage(hpf, newurl, "sm_", , , newfilename);
File.Delete(newurl + "_" + newfilename);
} /// <summary>
/// 生成缩略图
/// </summary>
/// <param name="upImage"></param>
/// <param name="sSavePath"></param>
/// <param name="sThumbExtension"></param>
/// <param name="intThumbWidth"></param>
/// <param name="intThumbHeight"></param>
/// <param name="filename"></param>
private void JREUpLoadImage(HttpPostedFile upImage, string sSavePath, string sThumbExtension, int intThumbWidth, int intThumbHeight, string filename)
{
string sThumbFile = "";
string sFilename = filename;
int nFileLen = upImage.ContentLength;
string extendName = System.IO.Path.GetExtension(upImage.FileName).ToLower(); byte[] myData = new Byte[nFileLen];
upImage.InputStream.Read(myData, , nFileLen);
sFilename = System.IO.Path.GetFileName(filename);
int file_append = ; //以上为上传原图
try
{
//原图加载
using (Image sourceImage = Image.FromFile(sSavePath + sFilename))
{ //旋转图片
RotateImage(sourceImage); //原图宽度和高度
int width = sourceImage.Width;
int height = sourceImage.Height;
int smallWidth;
int smallHeight;
//获取第一张绘制图的大小,(比较 原图的宽/缩略图的宽 和 原图的高/缩略图的高)
if ((decimal)width / intThumbWidth <= ((decimal)height) / intThumbHeight)
{
smallWidth = width * intThumbHeight / height;
smallHeight = intThumbHeight;
}
else
{
smallWidth = intThumbWidth;
smallHeight = height * intThumbWidth / width;
}
//判断缩略图在当前文件夹下是否同名称文件存在
file_append = ;
sThumbFile = sThumbExtension + sFilename;
while (System.IO.File.Exists(sSavePath + sThumbFile))
{
file_append++;
sThumbFile = sThumbExtension + System.IO.Path.GetFileNameWithoutExtension(upImage.FileName) + file_append.ToString() + ".jpg";
} //缩略图保存的绝对路径
string smallImagePath = sSavePath + sThumbFile;
//新建一个图板,以最小等比例压缩大小绘制原图
using (Image bitmap = new Bitmap(smallWidth, smallHeight))
{
//绘制中间图
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
{
//高清,平滑
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.Clear(Color.Black);
g.DrawImage(
sourceImage,
new System.Drawing.Rectangle(, , smallWidth, smallHeight),
new System.Drawing.Rectangle(, , width, height),
System.Drawing.GraphicsUnit.Pixel
);
}
//新建一个图板,以缩略图大小绘制中间图
using (System.Drawing.Image bitmap1 = new System.Drawing.Bitmap(intThumbWidth, intThumbHeight))
{
//绘制缩略图
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap1))
{
//高清,平滑
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.Clear(Color.Black);
int lwidth = (smallWidth - intThumbWidth) / ;
int bheight = (smallHeight - intThumbHeight) / ;
g.DrawImage(bitmap, new Rectangle(, , intThumbWidth, intThumbHeight), lwidth, bheight, intThumbWidth, intThumbHeight, GraphicsUnit.Pixel);
g.Dispose();
bitmap.Save(smallImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
}
}
catch
{
//出错则删除
System.IO.File.Delete(sSavePath + sFilename);
}
}
/// <summary>
/// 旋转图片
/// </summary>
/// <param name="img"></param>
private void RotateImage(Image img) {
var exif = ReadExif(img);
if (exif.ContainsKey("Orientation"))
{
switch (int.Parse(exif["Orientation"]))
{
case :
img.RotateFlip(RotateFlipType.RotateNoneFlipX);//horizontal flip
break;
case :
img.RotateFlip(RotateFlipType.Rotate180FlipNone);//right-top
//img = Rotate((Bitmap)img, 180);
break;
case :
img.RotateFlip(RotateFlipType.RotateNoneFlipY);//vertical flip
break;
case :
img.RotateFlip(RotateFlipType.Rotate90FlipX);
break;
case :
img.RotateFlip(RotateFlipType.Rotate90FlipNone);//right-top
break;
case :
img.RotateFlip(RotateFlipType.Rotate270FlipX);
break;
case :
img.RotateFlip(RotateFlipType.Rotate270FlipNone);//left-bottom
break;
}
}
} /// <summary>
/// 获取图片旋转角度
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
private Dictionary<string, string> ReadExif(Image image)
{
var exif = new Dictionary<string, string>();
var properties = image.PropertyItems;
foreach (var property in properties)
{
switch (property.Id)
{
case 0x010E:
exif["ImageTitle"] = ASCIIToString(property.Value);
break;
case 0x010F:
exif["Make"] = ASCIIToString(property.Value);
break;
case 0x0110:
exif["Model"] = ASCIIToString(property.Value);
break;
case 0x0112:
exif["Orientation"] = ShortToString(property.Value, );
break;
case 0x011A:
exif["XResolution"] = RationalToSingle(property.Value, );
break;
case 0x011B:
exif["YResolution"] = RationalToSingle(property.Value, );
break;
case 0x0128:
exif["ResolutionUnit"] = ShortToString(property.Value, );
break;
case 0x0131:
exif["Software"] = ASCIIToString(property.Value);
break;
case 0x0132:
exif["DateTime"] = ASCIIToString(property.Value);
break;
//GPS
case 0x0002:
exif["GPSLatitude"] = string.Format("{0}°{1}′{2}″",
RationalToSingle(property.Value, ),
RationalToSingle(property.Value, ),
RationalToSingle(property.Value, )
);
break;
case 0x0004:
exif["GPSLongitude"] = string.Format("{0}°{1}′{2}″",
RationalToSingle(property.Value, ),
RationalToSingle(property.Value, ),
RationalToSingle(property.Value, )
);
break;
case 0x0006:
exif["GPSAltitude"] = RationalToSingle(property.Value, );
break;
}
}
return exif;
} string ByteToString(byte[] b, int startindex)
{
if (startindex + <= b.Length)
return ((char)b[startindex]).ToString();
else
return string.Empty;
} string ShortToString(byte[] b, int startindex)
{
if (startindex + <= b.Length)
return BitConverter.ToInt16(b, startindex).ToString();
else
return string.Empty;
} string RationalToSingle(byte[] b, int startindex)
{
if (startindex + <= b.Length)
return (BitConverter.ToSingle(b, startindex) / BitConverter.ToSingle(b, startindex + )).ToString();
else
return string.Empty;
} string ASCIIToString(byte[] b)
{
return Encoding.ASCII.GetString(b);
}

生成缩略图 去除旋转角度

C# 生成缩略图 去除图片旋转角度的更多相关文章

  1. C#上传图片和生成缩略图以及图片预览

    因工作需要,上传图片要增加MIME类型验证和生成较小尺寸的图片用于浏览.根据网上代码加以修改做出如下效果图: 前台代码如下: <html xmlns="http://www.w3.or ...

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

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

  3. phpcms v9图片生成缩略图变成黑色解决方法

    今天客户反映,上传的图片生成缩略图有的图片变成黑色,出现问题就百度了一下,有不少网友也遇到这样的问题,但是官方论坛也没有给出解决办法,那还得靠自己解决了,于是就研究phpcms v9 图片压缩代码.打 ...

  4. PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图

    添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace ...

  5. js无刷新上传图片,服务端有生成缩略图,剪切图片,iphone图片旋转判断功能

    html: <form action="<{:AppLink('circle/uploadimg')}>" id="imageform" me ...

  6. PHP图片裁剪_图片缩放_PHP生成缩略图

    在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...

  7. yii php 图片上传与生成缩略图

    今天需要做图片上传与生成缩略图的功能,把代码进行记录如下: html 视图              ($pic_action_url = $this->createAbsoluteUrl('h ...

  8. 黄聪:C#图片处理封装类(裁剪、缩放、清晰度、加水印、生成缩略图)有示例(转)

    C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...

  9. php远程图片抓取存放到本地路径并生成缩略图

    private function _getcontent($content)    {               $img_dir='../Public/Img/Ycimg'; //远程图片抓取存放 ...

随机推荐

  1. jsp页面,jstl标签中的数据在<%%>java中使用

    可参考jsp的API隐式对象.. 这部分数据其实被保存在page域中,但jsp中如果使用java代码需要在特定的标签中<%%>,在这个标签中可使用的只有pageContext对象,所以可以 ...

  2. 《JAVA与模式》之适配器模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...

  3. 安装vue后报错 bash: vue: command not found

    今天参照之前写的vue的环境搭建一个新的项目  http://www.cnblogs.com/stella1024/p/7570884.html 安装完vue,并提示成功: $ npm install ...

  4. 【xsy1097】 拼图 构造题

    题目大意:请你使用n个图形拼成一个矩形.要求:①这每个图形都由1×1的小正方形组成,而且第i个图形由i个小正方形组成.②除了第1个和第2个图形以外,任意一个图形的所有小正方形,不都在一条直线上. 数据 ...

  5. 【NOI2013】快餐店 环套树+线段树

    题目大意:给你一颗环套树,你要在这棵的边上(包括端点)找一个点,使得离该点最远的点最近. 数据范围:$n≤10^5$,边权$≤10^9$. 此题不难看出一种暴力做法,我们依次断开环上的一条边,然后求整 ...

  6. puppet的使用:ERB模板

    ERB介绍 全称是Embedded RuBy,意思是嵌入式的Ruby,是一种文本模板技术,用过JSP的话,会发现两者语法很像. 我们项目中一般用ERB来产生各模块的配置文件.ERB模板也可以用来产生W ...

  7. habase 报错 ERROR: Can't get master address from ZooKeeper; znode data == null

    方法一:查看日志报SessionExpiredException: KeeperErrorCode = Session expired for /hbase/master 所以是hbase 和 zoo ...

  8. Java 集合框架:HashMap

    原文出处:Java8 系列之重新认识 HashMap 摘要 HashMap 是 Java 程序员使用频率最高的用于映射 (键值对) 处理的数据类型.随着 JDK(Java Developmet Kit ...

  9. 《深入理解Java虚拟机》目录

    第一部分 走进Java 第1章 走进Java   第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.2 运行时数据区域 2.3 HotSpot虚拟机对象探秘 第3章 垃圾收集器与 ...

  10. mysql和mysql jdbc连接器mysql-connector-java对应关系

    mysql和mysql jdbc连接器mysql-connector-java对应关系,请参考下图:来源于mysql官网