ImageResizer为图像生成错误的宽度

时间:2015-11-10 13:53:54

标签: c# imageresizer

我让用户上传最小宽度为400px的横幅。这个图像将获得1110px的广泛。 我尝试上传以下尺寸的图片: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像素高。 怎么了?

2 个答案:

答案 0 :(得分:2)

除非您通过scale=bothscale=canvas明确要求,否则ImageResizer不会升级图片。提升通常是不希望的。

此外,您可以将流直接传递给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);

答案 1 :(得分:1)

您测试的其他尺码均为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.
}