2

我必须在照片库中显示图像@ width=200 height=180,但是在上传图像时我必须调整它的大小,但问题是每张图像都有不同的分辨率。如何调整具有不同分辨率的图像大小以使图像保持不变。这是我的代码:

private void ResizeImage()
{
    System.Drawing.Image ImageToUpload = System.Drawing.Image.FromStream(FileUpload1.PostedFile.InputStream);
    byte[] image = null;
    int h = ImageToUpload.Height;
    int w = ImageToUpload.Width;
    int r = int.Parse(ImageToUpload.VerticalResolution.ToString());
    int NewWidth = 200;//constant
    int NewHeight = 180;//constant
    byte[] imagesize = FileUpload1.FileBytes;
    System.Drawing.Bitmap BitMapImage = new System.Drawing.Bitmap(ImageToUpload, NewWidth, NewHeight);//this line gives horrible output
    MemoryStream Memory = new MemoryStream();
    BitMapImage.Save(Memory, System.Drawing.Imaging.ImageFormat.Jpeg);
    Memory.Position = 0;
    image = new byte[Memory.Length + 1];
    Memory.Read(image, 0, image.Length);
}

如果分辨率为 96 并且我设置 maxwidth=200 那么它的高度将为 150 那么只有图像看起来小而准确。我们不能以所需的方式调整图像大小以使其看起来准确吗?

4

2 回答 2

2

该功能将调整图像保持纵横比。

public static Image Resize(Image originalImage, int w, int h)
{
    //Original Image attributes
    int originalWidth = originalImage.Width;
    int originalHeight = originalImage.Height;

    // Figure out the ratio
    double ratioX = (double)w / (double)originalWidth;
    double ratioY = (double)h / (double)originalHeight;
    // use whichever multiplier is smaller
    double ratio = ratioX < ratioY ? ratioX : ratioY;

    // now we can get the new height and width
    int newHeight = Convert.ToInt32(originalHeight * ratio);
    int newWidth = Convert.ToInt32(originalWidth * ratio);

    Image thumbnail = new Bitmap(newWidth, newHeight);
    Graphics graphic = Graphics.FromImage(thumbnail);

    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graphic.SmoothingMode = SmoothingMode.HighQuality;
    graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
    graphic.CompositingQuality = CompositingQuality.HighQuality;

    graphic.Clear(Color.Transparent);
    graphic.DrawImage(originalImage, 0, 0, newWidth, newHeight);

    return thumbnail;
}

用法

Image BitMapImage = Resize(ImageToUpload, NewWidth, NewHeight);
于 2013-07-03T06:31:20.697 回答
0

在这里,我将高度固定为 180 以保持纵横比。它将调整图像大小并保存到磁盘。返回值是我在“背景大小”css 中使用的百分比值。

public float ResizePhoto(string filepath, string filename)
    {
        var path = Path.Combine(filepath, filename);
        var newPath = Path.Combine(filepath, "sml_" + filename);
        Image orgImage = Image.FromFile(path);

        float fixedHt = 180f;
        int destHeight, destWidth;
        float reqScale;


        if(orgImage.Height > fixedHt)
        {
            destHeight = (int)fixedHt;
            destWidth = (int)(fixedHt / orgImage.Height * orgImage.Width);
            reqScale = destWidth  / destHeight * 100;
        }
        else
        {
            destHeight = orgImage.Height;
            destWidth = orgImage.Width;
            reqScale = fixedHt / destHeight * 100;
        }

        Bitmap bmp = new Bitmap(destWidth, destHeight);
        bmp.SetResolution(orgImage.HorizontalResolution,orgImage.VerticalResolution);
        Graphics grPhoto = Graphics.FromImage(bmp);

        grPhoto.DrawImage(orgImage,
            new Rectangle(0, 0, destWidth,  destHeight),
            new Rectangle(0, 0, orgImage.Width, orgImage.Height),
            GraphicsUnit.Pixel);

        bmp.Save(newPath);

        return reqScale;
    }
于 2018-03-05T05:51:50.347 回答