2014-12-09 3 views
1

Я пытаюсь изменить размер загруженных изображений в ASP.NET, сохраняя загруженный поток в растровое изображение, обрабатывая это растровое изображение и сохраняя обработанное растровое изображение в новом потоке, который должен быть сохранен на FTP папка. Загруженный поток успешно сохраняется как растровое изображение и обрабатывается должным образом; просто что-то не так с новым обработанным потоком, который превращается в поврежденное изображение. Здесь находится фрагмент кода:Сохранение растрового изображения в потоке

 s = FileUpload1.FileContent; 
     Bitmap bitmap = (Bitmap)Bitmap.FromStream(s); 
     Bitmap newBmp = new Bitmap(250, 250, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
     newBmp.SetResolution(72F, 72F); 
     Graphics newGraphic = Graphics.FromImage(newBmp); 
     newGraphic.Clear(Color.White); 
     newGraphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
     newGraphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     newGraphic.DrawImage(bitmap, 0, 0, 250, 250); 
     newBmp.Save(MapPath("temp.jpg")); 
     Stream memoryStream = new MemoryStream(); 
     newBmp.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
+0

Я был бы признателен за любую помощь. Заранее спасибо. –

+0

Что вы подразумеваете под «сохраненными в FTP»? Это сетевой протокол, а не формат файла. И каким образом результат является коррумпированным? Есть ли ошибка, вызванная ошибкой, или это видимая проблема в результате? и т. д. и т. д. –

+0

Прошу прощения, я имел в виду, что он должен быть сохранен в папке FTP. –

ответ

2

Ключевым моментом здесь является то, что вы получаете пустое изображение, которое почти всегда является потоком, который не читается с самого начала.

Вам необходимо вернуться к началу потока после того, как вы напишете его растровое изображение.

memoryStream.Seek(0, SeekOrigin.Begin); //go back to start 

В противном случае, когда вы попытаетесь сберечь этот поток позже, он будет читать поток с конца. Когда битмап записывает в поток, он добавляет байты И продвигает позицию. Вот пример кода в MVC, который работает.

Index.cshtml

@{ 
    ViewBag.Title = "Index"; 
} 

@using (Html.BeginForm("UploadImage", "BitmapConvert", FormMethod.Post, new { enctype = "multipart/form-data" })){ 
    <input type="file" name="uploadFile"/> 

    <input type="submit" value="Upload"/> 
} 

BitmapConvertController.cs

using System.Drawing; 
using System.IO; 
using System.Web; 
using System.Web.Mvc; 

namespace MvcSandbox.Controllers 
{ 
    public class BitmapConvertController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult UploadImage(HttpPostedFileBase uploadFile) 
     { 
      var s = uploadFile.InputStream; 

      var bitmap = new Bitmap(s); 

      var resizedBitmap = new Bitmap(250, 250, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
      resizedBitmap.SetResolution(72F, 72F); 

      using (var g = Graphics.FromImage(resizedBitmap)) 
      { 
       g.Clear(Color.White); 
       g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
       g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
       g.DrawImage(bitmap, 0, 0, 250, 250); 

       resizedBitmap.Save("C:\\Test\\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 

       using (var memoryStream = new MemoryStream()) 
       { 
        resizedBitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); 

        using (var dest = new FileStream("C:\\Test\\stream.jpg", FileMode.OpenOrCreate)) 
        { 
         memoryStream.Seek(0, SeekOrigin.Begin); //go back to start 
         memoryStream.CopyTo(dest); 
        } 
       } 

      } 

      return RedirectToAction("Index"); 
     } 
    } 
} 
+0

Спасибо verrrrrrry много .. Проблема была, как вы заявили; поток памяти не был прочитан с самого начала. Когда я добавил строку memystream.seek, она работала как шарм. Спасибо миллион раз. –

Смежные вопросы