C# 生成缩略图 去除图片旋转角度
图片生成缩略图会有旋转角度
/// <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# 生成缩略图 去除图片旋转角度的更多相关文章
- C#上传图片和生成缩略图以及图片预览
因工作需要,上传图片要增加MIME类型验证和生成较小尺寸的图片用于浏览.根据网上代码加以修改做出如下效果图: 前台代码如下: <html xmlns="http://www.w3.or ...
- PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转
[强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...
- phpcms v9图片生成缩略图变成黑色解决方法
今天客户反映,上传的图片生成缩略图有的图片变成黑色,出现问题就百度了一下,有不少网友也遇到这样的问题,但是官方论坛也没有给出解决办法,那还得靠自己解决了,于是就研究phpcms v9 图片压缩代码.打 ...
- PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图
添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace ...
- js无刷新上传图片,服务端有生成缩略图,剪切图片,iphone图片旋转判断功能
html: <form action="<{:AppLink('circle/uploadimg')}>" id="imageform" me ...
- PHP图片裁剪_图片缩放_PHP生成缩略图
在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...
- yii php 图片上传与生成缩略图
今天需要做图片上传与生成缩略图的功能,把代码进行记录如下: html 视图 ($pic_action_url = $this->createAbsoluteUrl('h ...
- 黄聪:C#图片处理封装类(裁剪、缩放、清晰度、加水印、生成缩略图)有示例(转)
C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...
- php远程图片抓取存放到本地路径并生成缩略图
private function _getcontent($content) { $img_dir='../Public/Img/Ycimg'; //远程图片抓取存放 ...
随机推荐
- WKWebView 里 JS 和 native 通信的例子
native 端 初始化 wkwebview,设置 message handler webView = WKWebView.init() let usecc = self.webView.config ...
- (原创)定时线程池中scheduleWithFixedDelay和scheduleAtFixedRate的区别
scheduleAtFixedRate 没有什么歧义,很容易理解,就是每隔多少时间,固定执行任务. scheduleWithFixedDelay 比较容易有歧义 貌似也是推迟一段时间执行任务,但Ora ...
- laydata 点击日期闪现
因项目需求需要多个日期,然后点击日期就会出现闪现的情况,导致选择不了日期 html代码 <table class="form"> <tr> <th c ...
- 用AR.js实现webAR(新手入门)
开发需要准备的东西: ** 域名 命名 这里是测试
- netsh 第一次用这命令
转载自 目标是WIN7 X64,且开启了防火墙,想要用他的机器去访问别的机器,又不想登陆他的系统,常规办法一般是上传一个htran,然后进行转发,但是对方有杀软,有被杀的可能性,所以我用另外一种办法达 ...
- Chapter 3 Phenomenon——2
I had enough trouble not falling down when the ground was dry; it might be safer for me to go back t ...
- js便签笔记(2)——DOM元素的特性(Attribute)和属性(Property)
1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...
- 神经网络中的池化层(pooling)
在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合).为什么可以通过降低维度呢? 因为图像具有一种“静态性”的属性,这 ...
- PHP 运行相关概念
web server.cgi.cgi程序.fast-cgi.php-fpm.php-cgi
- Maven可以提交到官方公共仓库maven.org
参考http://central.sonatype.org/pages/ossrh-guide.html这个网址的操作,即可提交到maven.org. 这里有具体的实践方法:http://blog.c ...