在我的项目中,我必须使用c#程序通过输入百分比来减小图像大小。
但是,有问题:
图片格式: TIF
原图片: 6MB,分辨率:1920*1080
调整图片大小: 27KB与1728*972
缩小到 90%
不应该是27KB,而是>5 mb…
代码 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
块
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);