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

C# 减少来自HttpPostedFileBase的图像大小(物理和尺寸),然后转换为base64,c#,image,C#,Image,有没有人有一个很好的例子,可以将来自HttpPostedFileBase的图像文件转换为较小的大小,然后将图像转换为base64?我花了好几个小时在这上面,一点运气都没有。这是我的代码的开始。其中一些是硬编码的(图像大小) 当我将base64放置在图像标记中并在浏览器中查看它时,这会给我一个黑色图像 public ActionResult Upload(HttpPostedFileBase file, decimal? id, decimal? id2) {

有没有人有一个很好的例子,可以将来自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。这比称为复制的问题更具体。

我本人从未使用过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();
        }
    }

我的ReduceSize()方法保持纵横比。您可能不需要这样做,而且您可能还希望更改参数,以便可以更改指定其大小的方式。试一试,让我知道它是如何工作的。

我自己从未使用过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();
        }
    }

我的ReduceSize()方法保持纵横比。您可能不需要这样做,而且您可能还希望更改参数,以便可以更改指定其大小的方式。给它一个镜头,让我知道它是怎么做的。

Image有一个GetThumbnailImage方法,您可以使用它来获得较小的图像。然后可以使用“保存”将新图像写入流。这不是重复的question@JHunt重新打开-我不确定你需要什么关于base64部分-一些澄清可能是必要的。我希望回答这个问题的人也能解释文章中提供的代码。Image有一个GetThumbnailImage方法,你可以用它来获得一个更小的图像。然后可以使用“保存”将新图像写入流。这不是重复的question@JHunt重新打开-我不确定你需要什么关于base64部分-一些澄清可能是必要的。我希望回答这个问题的人也能解释文章中提供的代码。它非常有效!你有关于如何学习更多图像处理的资源吗?我如何在这个话题上变得更有效率?图像处理是一个巨大的话题。你可能只想在网上搜索你想完成的特定任务。这很有效!你有关于如何学习更多图像处理的资源吗?我如何在这个话题上变得更有效率?图像处理是一个巨大的话题。你可能只想在网上搜索你想完成的特定任务。