[英]resize Image with less loss in C#
在我的項目中,我必須通過輸入百分比來使用 C# 程序減小圖像大小。
然而,有些不對勁:
圖片格式: TIF
原圖: 6MB,1920*1080
調整大小的圖像: 27KB,1728*972
縮小到90%
它不應該是 27KB,而是 > 5MB...
代碼
public Image reduce(Image sourceImage, string size)
{
var original = sourceImage;
//store image widths in variable for easier use
var oW = (decimal)original.Width;
var oH = (decimal)original.Height;
var dW = (decimal)desiredWidth;
var dH = (decimal)desiredHeight;
var dR = (decimal)Int32.Parse(size);;
var nH = oH * (dR / 100);
var nW = oW * (dR / 100);
var resized = new Bitmap((int)nW, (int)nH);
using (Graphics gr = Graphics.FromImage(sourceImage))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(resized, new Rectangle(0, 0, (int)nH, (int)nW));
}
return resized;
}
有任何想法嗎?
更新
Image nImage = imagetool.reduce(originalImg, size);
byte[] nImageData = imagetool.imageToByteArray(nImage);
int nImageSize = nImageData.Length;
Console.WriteLine("new image size " + nImageSize );
try
{
Console.WriteLine("trying to update the image in sharepoint");
web.Files.Add(Path.Combine(itemsite, itemSubsite, fileURL), nImageData, true);
}
更新 2
public byte[] imageToByteArray(Image imageIn)
{
using (var ms = new MemoryStream())
{
if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms.ToArray();
}
if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Bmp))
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
return ms.ToArray();
}
if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Gif))
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Tiff))
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);
return ms.ToArray();
}
else
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
}
}
nImage
是在其他地方創建的
var resized = new Bitmap((int)nW, (int)nH)
並且它的格式不是 TIFF 並且代碼結束於:
else
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
你的新形象沒有任何格式,它不會自動從原來的,當你創建新的讀取Bitmap
對象,並因此被寫入了為JPG,(從最終else
你的代碼的一部分)
解決這個問題的方法是將原始格式傳遞給imageToByteArray
,並在將新圖像寫入MemoryStream
時使用它。 你也可以if..else
長的if..else
塊
public byte[] imageToByteArray(Image imageIn, ImageFormat format)
{
using(var ms = new MemoryStream())
{
imageIn.Save(ms,format);
return ms.ToArray();
}
}
你的調用代碼應該是
byte[] nImageData = imagetool.imageToByteArray(nImage, originalImg.RawFormat);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.