Asp.net 以 kb 为单位缩小图像大小
Posted
技术标签:
【中文标题】Asp.net 以 kb 为单位缩小图像大小【英文标题】:Asp.net reduced image size in kb 【发布时间】:2014-02-19 01:38:50 【问题描述】:我发布了另一个主题,得到了一些温和的回复,但尽管答案解决了问题的质量方面,但它们在图像大小 (kb) 方面产生了另一个问题。 Asp.net image resizing quality
这就是问题所在。
我有一个 2MB 的图像,我想将其缩小到 480 像素宽度。
我使用了三种不同的方式来调整它的大小:
1) 在 Fileupload 上运行此代码:
System.IO.Stream st = FileUploadPost.PostedFile.InputStream;
myImage = System.Drawing.Image.FromStream(st);
thumb = myImage.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);
thumb.Save(myPath);
好处:以 kb 为单位的大小变小(大约 80Kb)。
缺点:视觉质量很糟糕
2) 在 Fileupload 上运行此代码(在提到的帖子中提供了解决方案):
Bitmap newImg = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Graphics newGraphic = Graphics.FromImage(newImg);
newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
newGraphic.Dispose();
newImg.Save(myPath);
优点:视觉质量很好
缺点:大小仍然很大(大约 400kb)
3) 使用 Windows Paint 软件并“手动”将图像缩小到 480px 宽度
好处:1) 和 2) 的好处 -> 视觉质量很好,大小减少到 80kb 左右
问题是:
重现第 3 项行为(良好的视觉质量和较小的 kb 大小)的代码是什么?
谢谢
【问题讨论】:
试试imageresizing.net 【参考方案1】:尝试以下方法之一:
Bitmap newImg = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
Graphics newGraphic = Graphics.FromImage(newImg);
newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
newGraphic.Dispose();
newImg.Save(myPath);
或
Bitmap newImg = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format16bppArgb1555);
Graphics newGraphic = Graphics.FromImage(newImg);
newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
newGraphic.Dispose();
newImg.Save(myPath);
或
Bitmap newImg = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
Graphics newGraphic = Graphics.FromImage(newImg);
newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
newGraphic.Dispose();
newImg.Save(myPath);
这只会稍微降低质量并大幅减小尺寸,但我不确定哪个会更好。
这里还有一大堆其他选项可供尝试:
http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat%28v=vs.110%29.aspx
【讨论】:
嘿伙计!这真的有效!非常感谢!!!您上面的第一个选项将图像减小到 193kb(我之前得到的大小的一半)并且视觉上的质量保持不变。选项 2 和 3 出错。也会尝试其他链接。再次感谢!【参考方案2】: protected void Page_Load(object sender, EventArgs e)
//BR**
string filePath = "";//Source file path with image name
int CompressLevel = 50;//Image compression leve as per our requirement
string DestintionPath = "";//Destination file path
string Filename = "";//Output image name to save in destination path
Stream bmpStream = System.IO.File.Open(filePath, System.IO.FileMode.Open);
Bitmap bmp1 = new Bitmap(bmpStream);
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, CompressLevel);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(DestintionPath + "\\" + Filename, jpgEncoder, myEncoderParameters);
//BR**
bmpStream.Close();
string lblmsg = "Compressed Sucessfully with Compression Level " + CompressLevel.ToString() + " ";
private ImageCodecInfo GetEncoder(ImageFormat format)
/*/ Hope this will work.Thanks in advance /*/
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
if (codec.FormatID == format.Guid)
return codec;
return null;
【讨论】:
以上是关于Asp.net 以 kb 为单位缩小图像大小的主要内容,如果未能解决你的问题,请参考以下文章