减少来自HttpPostedFileBase的图像大小(物理和尺寸),然后转换为base64

时间:2015-09-26 01:10:09

标签: c# image

有没有人有一个很好的例子,将来自HttpPostedFileBase的图像文件转换为缩小的尺寸,然后将图像转换为base64?我花了几个小时没有运气。这是我的代码的开始。其中一些是硬编码的(图像大小)。

当我将base64放在图片标签中并在浏览器中查看时,这会给我一个黑色图像。

    public ActionResult Upload(HttpPostedFileBase file, decimal? id, decimal? id2)
    {                        
            Image img = Image.FromStream(file.InputStream, true, true);

            var bitmap = new Bitmap(img.Width - 100, img.Height - 100);

            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            byte[] imageBytes = stream.ToArray();
            string base64String = Convert.ToBase64String(imageBytes);
            InsertImage(base64String);
     }

我问如何更改图像然后将其转换为base64。这比称为重复的问题更具体。

1 个答案:

答案 0 :(得分:4)

我自己从未使用过HttpPostedFileBase。所以,我稍微简化了一下这个问题,实际上你应该尝试对未来的问题做些什么。你应该尽可能地缩小焦点。也就是说,这是一种减少流表示的图像尺寸并将新图像作为字节数组返回的方法。

    private static byte[] ReduceSize(FileStream stream, int maxWidth, int maxHeight)
    {
        Image source = Image.FromStream(stream);
        double widthRatio = ((double)maxWidth) / source.Width;
        double heightRatio = ((double)maxHeight) / source.Height;
        double ratio = (widthRatio < heightRatio) ? widthRatio : heightRatio;
        Image thumbnail = source.GetThumbnailImage((int)(source.Width * ratio), (int)(source.Height * ratio), AbortCallback, IntPtr.Zero);
        using (var memory = new MemoryStream())
        {
            thumbnail.Save(memory, source.RawFormat);
            return memory.ToArray();
        }
    }

您可以像这样调用此方法:

public ActionResult Upload(HttpPostedFileBase file, decimal? id, decimal? id2)
{
    byte[] imageBytes = ReduceSize(file.InputStream, 100, 100);
    string base64String = Convert.ToBase64String(imageBytes);
    InsertImage(base64String);
}

我的ReduceSize()方法保持纵横比。您可能不需要它,也可能需要更改参数,以便更改指定其大小的方式。给出一个镜头,让我知道它是如何做的。