[分享]重提:上传图片生成略缩图“最佳解决”

问题描述

从用.NetWeb开发到现在所看到的略缩生成代码都不尽人意,要不太局限,要不失真厉害。为此写了一个相对完善的函数供大家学习。其中的SaveIamge函数提供了失真解决方法,对于处理过的图片(如加水印……)要求保持高品质可以直接调用。usingSystem;usingSystem.IO;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Drawing.Imaging;usingSystem.Drawing.Text;usingSystem.Text.RegularExpressions;///<summary>//图片处理。//http://www.hulaka.com///(c)2008Dao///</summary>publicclassImage{///<summary>///缩略模式。///</summary>publicenumThumbMode:byte{///<summary>///完整模式///</summary>Full=1,///<summary>///最大尺寸///</summary>Max}///<summary>///缩略图。///</summary>///<paramname="image">要缩略的图片</param>///<paramname="size">要缩放的尺寸</param>///<paramname="mode">缩略模式</param>///<paramname="contentAlignment">对齐方式</param>///<returns>返回已经缩放的图片。</returns>publicstaticBitmapThumbnail(Bitmapimage,Sizesize,ThumbModemode,ContentAlignmentcontentAlignment){if(!size.IsEmpty&&!image.Size.IsEmpty&&!size.Equals(image.Size)){//先取一个宽比例。doublescale=(double)image.Width/(double)size.Width;//缩略模式switch(mode){caseThumbMode.Full:if(image.Height>image.Width)scale=(double)image.Height/(double)size.Height;break;caseThumbMode.Max:if(image.Height/scale<size.Height)scale=(double)image.Height/(double)size.Height;break;}SizeFnewSzie=newSizeF((float)(image.Width/scale),(float)(image.Height/scale));Bitmapresult=newBitmap(size.Width,size.Height);using(Graphicsg=Graphics.FromImage(result)){g.FillRectangle(Brushes.White,newRectangle(newPoint(0,0),size));g.InterpolationMode=InterpolationMode.HighQualityBicubic;g.SmoothingMode=SmoothingMode.HighQuality;g.PixelOffsetMode=PixelOffsetMode.HighQuality;g.CompositingMode=CompositingMode.SourceOver;g.CompositingQuality=CompositingQuality.HighQuality;g.TextRenderingHint=TextRenderingHint.AntiAliasGridFit;//对齐方式RectangleFdestRect;switch(contentAlignment){caseContentAlignment.TopCenter:destRect=newRectangleF(newPointF(-(float)((newSzie.Width-size.Width)*0.5),0),newSzie);break;caseContentAlignment.TopRight:destRect=newRectangleF(newPointF(-(float)(newSzie.Width-size.Width),0),newSzie);break;caseContentAlignment.MiddleLeft:destRect=newRectangleF(newPointF(0,-(float)((newSzie.Height-size.Height)*0.5)),newSzie);break;caseContentAlignment.MiddleCenter:destRect=newRectangleF(newPointF(-(float)((newSzie.Width-size.Width)*0.5),-(float)((newSzie.Height-size.Height)*0.5)),newSzie);break;caseContentAlignment.MiddleRight:destRect=newRectangleF(newPointF(-(float)(newSzie.Width-size.Width),-(float)((newSzie.Height-size.Height)*0.5)),newSzie);break;caseContentAlignment.BottomLeft:destRect=newRectangleF(newPointF(0,-(float)(newSzie.Height-size.Height)),newSzie);break;caseContentAlignment.BottomCenter:destRect=newRectangleF(newPointF(-(float)((newSzie.Width-size.Width)*0.5),-(float)(newSzie.Height-size.Height)),newSzie);break;caseContentAlignment.BottomRight:destRect=newRectangleF(newPointF(-(float)(newSzie.Width-size.Width),-(float)(newSzie.Height-size.Height)),newSzie);break;default:destRect=newRectangleF(newPointF(0,0),newSzie);break;}g.DrawImage(image,destRect,newRectangleF(newPointF(0F,0F),image.Size),GraphicsUnit.Pixel);image.Dispose();}returnresult;}elsereturnimage;}///<summary>///保存图片。///</summary>///<paramname="image">要保存的图片</param>///<paramname="quality">品质(1L~100L之间,数值越大品质越好)</param>///<paramname="filename">保存路径</param>publicstaticvoidSaveIamge(Bitmapimage,longquality,stringfilename){using(EncoderParametersencoderParams=newEncoderParameters(1)){using(EncoderParameterparameter=(encoderParams.Param[0]=newEncoderParameter(Encoder.Quality,quality))){ImageCodecInfoencoder=null;//取得扩展名stringext=Path.GetExtension(filename);if(string.IsNullOrEmpty(ext))ext=".jpg";//根据扩展名得到解码、编码器foreach(ImageCodecInfocodecInfoinImageCodecInfo.GetImageEncoders()){if(Regex.IsMatch(codecInfo.FilenameExtension,string.Format(@"(;|^)*{0}(;|$)",ext),RegexOptions.IgnoreCase)){encoder=codecInfo;break;}}Directory.CreateDirectory(Path.GetDirectoryName(filename));image.Save(filename,encoder,encoderParams);}}}///<summary>///保存图片。///</summary>///<paramname="stream">要保存的流</param>///<paramname="quality">品质(1L~100L之间,数值越大品质越好)</param>///<paramname="filename">保存路径</param>publicstaticvoidSaveIamge(Streamstream,longquality,stringfilename){using(BitmapbmpTemp=newBitmap(stream)){SaveIamge(bmpTemp,quality,filename);}}}具体请看这里:

解决方案

解决方案二:
分享..........
解决方案三:
LZ是个好人
解决方案四:
谢谢楼上支持!!
解决方案五:
啊啊啊啊啊啊?好不容易发个帖被列为精了,居然给删了,太过分了!!
解决方案六:
收藏了
解决方案七:
占个位置看看,支持下
解决方案八:
好东西。不过不太清楚怎么用呢。郁闷,要仔细看看。
解决方案九:
谢谢各位支持
解决方案十:
Thankyou~!
解决方案十一:
谢谢
解决方案十二:
收藏了
解决方案十三:
谢谢楼上支持!!
解决方案十四:
UP
解决方案十五:
up.....
解决方案:
up
解决方案:
好东西啊!!!
解决方案:
支持。。。
解决方案:
up
解决方案:
感谢LZ
解决方案:
谢谢
解决方案:
不用谢~!!!UP!!

时间: 2024-09-20 00:06:57

[分享]重提:上传图片生成略缩图“最佳解决”的相关文章

java 自动生成略缩图示例代码

本篇文章,在前辈的经验基础上,分别对单图生成略缩图和批量生成略缩图做个小结   当你要做一个图库的项目时,对图片大小.像素的控制是首先需要解决的难题. 一.单图生成略缩图单图经过重新绘制,生成新的图片.新图可以按一定比例由旧图缩小,也可以规定其固定尺寸.详细代码如下: 复制代码 代码如下: <SPAN style="FONT-SIZE: 14px">import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.su

php图片上传类,支持加水印,生成略缩图

 代码如下 复制代码 <?php /*----------------------------------------------------------------------------------  *  *----------------------------------------------------------------------------------  */ class image_up{  //定义基本参数  private $uptype=array('image/

java 自动生成略缩图示例代码_java

当你要做一个图库的项目时,对图片大小.像素的控制是首先需要解决的难题.一.单图生成略缩图单图经过重新绘制,生成新的图片.新图可以按一定比例由旧图缩小,也可以规定其固定尺寸.详细代码如下: 复制代码 代码如下: <SPAN style="FONT-SIZE: 14px">import com.sun.image.codec.jpeg.JPEGImageEncoder;import com.sun.image.codec.jpeg.JPEGCodec;import com.su

上传图片并生成略缩图(c#)

上传|上传图片 参数说明FileBox:上传表单中的表单名SavePath:保存路径ThumbnailWidth:略缩图宽ThumbnailHeight:略缩图高FilePath:文件保存路径(输出参数)FileName:文件名称(输出参数)LastError:(输出错误)public static bool UploadImages(System.Web.UI.HtmlControls.HtmlInputFile FileBox,string SavePath,Int32 ThumbnailW

php生成略缩图代码_php技巧

虽然在HTML中可以通过指定图片的宽度和高度来随意缩放图片,但是这种方法不会减少图片的像素数目.图形文件的尺寸没有改变,当然也不会加快图片下载的速度了.当然也可以手动通过图形软件生成图片的缩略图,但对于大量的图片展示来说,这个工作量将十分巨大.为此微缩图的自动生成程序就被设计出来了. PHP中提供的imagecopyresized函数就可以用来生成真正的缩赂图片.该函数的标推 语法如下: 语法:int imagecopyresized(int dst_im,int src_im,int dstX

ThinkPHP3.0略缩图不能保存到子目录的解决方法_php实例

解决办法一(ThinkPHP官方提供的办法,我并没有测试过):升级到ThinkPHP3.1最新的UploadFile.class.php(https://github.com/liu21st/extend/tree/master/Extend/Library/ORG/Net),下载后替换原来的UploadFile.class.php 解决办法二:修改UploadFile.class.php的部分代码 这是自己做的解决办法,增加一个略缩图的子目录生成函数步骤1>> UploadFile.clas

ThinkPHP3.0略缩图不能保存到子目录解决办法总结

 解决办法一(ThinkPHP官方提供的办法,我并没有测试过):升级到ThinkPHP3.1最新的UploadFile.class.php(https://github.com/liu21st/extend/tree/master/Extend/Library/ORG/Net),下载后替换原来的UploadFile.class.php   解决办法二:修改UploadFile.class.php的部分代码 这是自己做的解决办法,增加一个略缩图的子目录生成函数 步骤1>> UploadFile.

win7系统略缩图错乱怎么办?

  修复Windows7缩略图错乱问题:win7系统预览图片文件缩略图无法显示正常,通常这样的情况若不是中毒,那么就是缓存文件出现问题.我们存储的缓存文件一般都在文件夹中,方便下次使用预览,但有时缓存文件会崩溃,这时就需要重建缓存文件. 1.在开始搜索栏中键入"磁盘清理",然后按回车键打开磁盘清理工具; 2.选择系统盘盘符; 3.现在您需要做的,仅仅是在"要删除的文件"一栏中,勾选"缩略图"项.然后,确认删除. 通过上述的操作步骤可以有效的修复w

php上传图片生成缩略图(GD库)_php技巧

首先来一段简单的php上传图片生成缩略图的详细代码,分享给大家供大家参考,具体内容如下 <?php function createThumbnail($imageDirectory, $imageName, $thumbDirectory, $thumbWidth, $quality){ $details = getimagesize("$imageDirectory/$imageName") or die('Please only upload images.'); $type