这就是我使用它的方式:
Bitmap bmp1 = new Bitmap(ResizeImages(fileName,100,100));
但是现在我在这个例子100,100中改变了图像分辨率 但现在我想用kb改变图像大小,我的意思是如果文件大小是3.64MB或者例如3,227KB,我知道在网站上我想将图像上传到单个图像的最大尺寸我可以上传1024k所以我希望能够将图像大小更改为1024k。
我想制作类似ResizeImages的内容,而是添加像100,100这样的分辨率来添加像ResizeImages(fileName,1024)这样的大小;
这是ResizeImages方法,但是制作新方法可能更好吗?
private static Bitmap ResizeImages(String filename, int maxWidth, int maxHeight)
{
using (Image originalImage = Image.FromFile(filename))
{
//Caluate new Size
int newWidth = originalImage.Width;
int newHeight = originalImage.Height;
double aspectRatio = (double)originalImage.Width / (double)originalImage.Height;
if (aspectRatio <= 1 && originalImage.Width > maxWidth)
{
newWidth = maxWidth;
newHeight = (int)Math.Round(newWidth / aspectRatio);
}
else if (aspectRatio > 1 && originalImage.Height > maxHeight)
{
newHeight = maxHeight;
newWidth = (int)Math.Round(newHeight * aspectRatio);
}
if (newWidth >= 0 && newHeight >= 0)
{
Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics g = Graphics.FromImage(newImage))
{
//--Quality Settings Adjust to fit your application
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
return newImage;
}
}
return null;
}
更新
我发现了这两种方法并且它起作用,但我并不了解它如何处理尺寸变化:
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
private static void SaveJPGWithCompressionSetting(Image image, string szFileName, long lCompression)
{
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, lCompression);
ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
image.Save(szFileName, ici, eps);
}
在构造函数中我做了:
Bitmap bmp1 = new Bitmap(fileName);
SaveJPGWithCompressionSetting(bmp1, FilePath, 10L);
bmp1.Dispose();
10L意味着什么?
在这种情况下,例如fileName原始大小为6.71MB 新的reszied文件现在是566KB
如果我想让文件大小为1024k?
答案 0 :(得分:1)
所以现在使用以下代码来创建一个jpeg文件:
Bitmap bmp1 = new Bitmap(fileName);
SaveJPGWithCompressionSetting(bmp1, FilePath, 10L);
bmp1.Dispose();
10L
将用于Encoder.Quality,这是0到100之间的数字,其中100是最高质量。 L
中的10L
只表示它是long
,而不是int
。所以上面的例子会写一个质量= 10的jpeg,即10%。
由于10%的质量非常低,您可能会发现它看起来不太好。 75%是更常见的价值。但是有10%你将文件大小从6.71MB减少到566KB,这是很多。使用75%时,文件会大得多。
当你需要1024k时,你需要找到导致文件大小的正确质量,或者更小一点,因为你不能超过限制。没有简单的方法来确定您需要的质量。你只需要尝试一下。
例如,你从50%开始,文件仍然太大,你尝试25%。你继续这样,直到找到最好的价值。如果您可以在内存中尝试此功能,那将是最好的。但我不确定这是可能的。否则,您只需将图像写入磁盘,然后检查文件大小。
它还取决于图像文件大小将减少多少特定质量。例如,屏幕截图比自然照片更难压缩(使用jpeg)。因此,对于每张图片,当文件大小为1024k时,您可能会有不同的质量设置。