ImageResizer 为图像生成错误的宽度
ImageResizer generate wrong width for the image
我让用户上传最小宽度为 400 像素的横幅。然后这张图片的宽度将达到 1110 像素。
我尝试上传以下尺寸的图片:960x390、410x410、784x250。
当我上传 784x250 时,图像得到相同的尺寸 784x250 而不是宽度 1110px。
我用这个:
int Height;
using (var Bmp = new Bitmap(str))
{
if (Bmp.Width < 400)
{
throw;
}
if (Bmp.Height < 150)
{
throw;
}
Height = Bmp.Height;
}
if (Height > 300)
{
Height = 300;
}
str.Position = 0;
var ImageData = str.StreamToByteArray();
var Settings = "width=1110;height="+ Height + ";format=jpg;mode=crop;"
var Setting = new ResizeSettings(Settings);
using (var Out = new MemoryStream())
{
using (var In = new MemoryStream(ImageData))
{
In.Seek(0, SeekOrigin.Begin);
var I = new ImageJob(In, Out, Setting)
{
CreateParentDirectory = false
};
I.Build();
}
Out.Position = 0;
// Upload to blob
}
(str 包含带有图像的流)
我希望图片的宽度为 1110 像素,最大高度为 300 像素。
怎么了?
您测试的其他尺寸每个都有一个 Bmp.Height > 300
,这意味着图像需要裁剪。
但是,当使用尺寸为 784x250 的图像时,不需要裁剪图像。所以你永远不会调整图像的大小。
假设您希望保持图像的比例正确,您应该首先调整图像的大小以匹配所需的宽度,然后在必要时裁剪超出的高度。
var image = new Bitmap(str);
var ratio = (double)1110 / image.Width;
var newWidth = (int)(image.Width * ratio);
var newHeight = (int)(image.Height * ratio);
var newImage = new Bitmap(newWidth, newHeight);
Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
var bmp = new Bitmap(newImage);
if(bmp.Height > 300){
//Resize again using crop, like you did in your original code.
}
ImageResizer 不会升级图像,除非您通过 scale=both
或 scale=canvas
特别要求。放大通常是不希望的。
此外,您可以将流直接传递给 ImageJob 并显着简化您的代码。
str.Seek(0, SeekOrigin.Begin);
var Out = new MemoryStream(8096);
new ImageJob(str, Out, new Instructions("width=1110;height="+ Height + ";format=jpg;mode=crop;scale=both")).Build();
Out.Seek(0, SeekOrigin.Begin);
我让用户上传最小宽度为 400 像素的横幅。然后这张图片的宽度将达到 1110 像素。 我尝试上传以下尺寸的图片:960x390、410x410、784x250。 当我上传 784x250 时,图像得到相同的尺寸 784x250 而不是宽度 1110px。
我用这个:
int Height;
using (var Bmp = new Bitmap(str))
{
if (Bmp.Width < 400)
{
throw;
}
if (Bmp.Height < 150)
{
throw;
}
Height = Bmp.Height;
}
if (Height > 300)
{
Height = 300;
}
str.Position = 0;
var ImageData = str.StreamToByteArray();
var Settings = "width=1110;height="+ Height + ";format=jpg;mode=crop;"
var Setting = new ResizeSettings(Settings);
using (var Out = new MemoryStream())
{
using (var In = new MemoryStream(ImageData))
{
In.Seek(0, SeekOrigin.Begin);
var I = new ImageJob(In, Out, Setting)
{
CreateParentDirectory = false
};
I.Build();
}
Out.Position = 0;
// Upload to blob
}
(str 包含带有图像的流)
我希望图片的宽度为 1110 像素,最大高度为 300 像素。 怎么了?
您测试的其他尺寸每个都有一个 Bmp.Height > 300
,这意味着图像需要裁剪。
但是,当使用尺寸为 784x250 的图像时,不需要裁剪图像。所以你永远不会调整图像的大小。
假设您希望保持图像的比例正确,您应该首先调整图像的大小以匹配所需的宽度,然后在必要时裁剪超出的高度。
var image = new Bitmap(str);
var ratio = (double)1110 / image.Width;
var newWidth = (int)(image.Width * ratio);
var newHeight = (int)(image.Height * ratio);
var newImage = new Bitmap(newWidth, newHeight);
Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
var bmp = new Bitmap(newImage);
if(bmp.Height > 300){
//Resize again using crop, like you did in your original code.
}
ImageResizer 不会升级图像,除非您通过 scale=both
或 scale=canvas
特别要求。放大通常是不希望的。
此外,您可以将流直接传递给 ImageJob 并显着简化您的代码。
str.Seek(0, SeekOrigin.Begin);
var Out = new MemoryStream(8096);
new ImageJob(str, Out, new Instructions("width=1110;height="+ Height + ";format=jpg;mode=crop;scale=both")).Build();
Out.Seek(0, SeekOrigin.Begin);