2016-08-20 1 views
1

У любого человека может быть что-то не так? Я получаю «Параметр недействителен» в строке «imageData.Save», но я подозреваю, что параметр imageData var является более ранним, чем это, поскольку я вижу некоторые исключения аргументов внутри объекта imageData после его установки. Спасибо за любые предложения.Параметр недействителен для изображения. Сохранение

using (Image image = Image.FromFile(Server.MapPath("~/User_Data/asset.png"))) 
      { 
       Image imageData = ResizeImage(image, 120, 120, image.Width, image.Height); 
       string base64String = this.ImageToBase64String(imageData, ImageFormat.Png); 
       <snip> 
      } 

public string ImageToBase64String(Image imageData, ImageFormat format) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      imageData.Save(stream, format); 
      return Convert.ToBase64String(stream.ToArray()); 
     } 
    } 

    public Image ResizeImage(Image image, int canvasWidth, int canvasHeight, int originalWidth, int originalHeight) 
    { 
     using (Image image2 = new Bitmap(canvasWidth, canvasHeight)) 
     using (Graphics graphics = Graphics.FromImage(image2)) 
     { 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.SmoothingMode = SmoothingMode.HighQuality; 
      graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      graphics.CompositingQuality = CompositingQuality.HighQuality; 
      double num = ((double)canvasWidth)/((double)originalWidth); 
      double num2 = ((double)canvasHeight)/((double)originalHeight); 
      double num3 = (num < num2) ? num : num2; 
      int height = Convert.ToInt32((double)(originalHeight * num3)); 
      int width = Convert.ToInt32((double)(originalWidth * num3)); 
      int x = Convert.ToInt32((double)((canvasWidth - (originalWidth * num3))/2.0)); 
      int y = Convert.ToInt32((double)((canvasHeight - (originalHeight * num3))/2.0)); 
      graphics.Clear(Color.White); 
      graphics.DrawImage(image, x, y, width, height); 
      ImageCodecInfo.GetImageEncoders(); 
      using (var parameters = new EncoderParameters(1)) 
      { 
       parameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L); 
      } 
      return image2; 
     } 
    } 

Вот скриншот моего отладчика ... это останавливается сразу после ImageData получает установлены и прямо перед ImageToBase64String называется. Эти исключения в файле imageData не приводят к сбою приложения, но, разумеется, это выглядит неправильно? enter image description here

+0

Вы получаете эту ошибку во время выполнения или времени компиляции? Он выглядит как действительный звонок. –

+0

Параметр Неверная ошибка происходит во время выполнения. (файл DOES существует) :) –

+0

добавление скриншота отладчика, чтобы попытаться показать неудобство с помощью imageData –

ответ

2

Короткий ответ, что вы избавляетесь от image2 через using блок, а затем пытается использовать его вне метода. Если вы исследуете ImageData вы увидите все виды плохих данных и исключения:

enter image description here

Dont избавиться от него, если вы возвращаете его; код вызова будет нести ответственность за утилизацию, если это, когда это будет сделано с ним:

//using (Image image2 = new Bitmap(canvasWidth, canvasHeight)) 
Image image2 = new Bitmap(canvasWidth, canvasHeight); 
using (Graphics graphics = Graphics.FromImage(image2)) 
{ 
    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    ... 
} 
return image2; 

Существует более простым способ масштабирования изображения и этот код паров кодека/качество не делает ничего.

public Image ResizeImage2(Image image, int canvasWidth, int canvasHeight) 
{ 
    // org size is already available 
    Size orginalSize = image.Size; 
    Size newSize = Size.Empty; 
    float scale; 

    if (canvasWidth != 0) 
    { 
     scale = (float)orginalSize.Height/orginalSize.Width; 
     newSize = new Size(canvasWidth, Convert.ToInt32(scale * canvasWidth)); 
    } 
    else if (canvasHeight != 0) 
    { 
     scale = (float)orginalSize.Width/orginalSize.Height; 
     newSize = new Size(Convert.ToInt32(scale * canvasHeight), canvasHeight); 
    }  

    //using (Image image2 = new Bitmap(canvasWidth, canvasHeight)) 
    Image image2 = new Bitmap(newSize.Width, newSize.Height); 
    using (Graphics graphics = Graphics.FromImage(image2)) 
    { 
     graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     graphics.SmoothingMode = SmoothingMode.HighQuality; 
     graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
     graphics.CompositingQuality = CompositingQuality.HighQuality; 

     graphics.Clear(Color.White); 
     graphics.DrawImage(image, 0, 0, newSize.Width, newSize.Height); 

     return image2; 
    } 
} 

Это масштабирует изображение, прошедшее на основе целевой ширины или высоты, с несколькими меньшими переменными. Кодек материал был удален, потому что вы будете использовать, что с помощью метода Save:

using (Image img = Image.FromFile(@"C:\Temp\BigHead.jpg")) 
{ 
    // resize img to the height of a PicBox 
    Image imageData = ResizeImage2(img, 0, pb2.Height); 
    // winforms show img 
    pb2.Image = imageData; 

    // get codec 
    ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders() 
     .FirstOrDefault(z => z.MimeType == "image/jpeg"); 
    using (var qparam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L)) 
    { 
     EncoderParameters encParams = new EncoderParameters(1); 
     encParams.Param[0] = qparam; 
     imageData.Save(@"C:\Temp\BigHead_thumb.jpg", codec, encParams); 

     // test: no encoder 
     imageData.Save(@"C:\Temp\BigHead_thumb2.jpg"); 
    } 
    // ToDo: dispose of returned image 
} 

вызывающий код может смотреть на изображение и решить, следует ли масштабировать до высоты или ширины. Тогда метод Image.Save использует Encoder, если вы хотите указать нестандартный уровень качества.

Результирующие размеры файлов отражают влияние кодировщика: 72k для метода по умолчанию, 194k с использованием параметра качества.

+0

Плутоникс, снова! Это действительно проблема! Еще раз спасибо за ваше время здесь! –

+1

Ваш код просто использует настройки по умолчанию. Если вы сравните размер файла, вы, скорее всего, увидите разницу. Ваш не ошибается, он просто не использует его – Plutonix

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

  • Нет связанных вопросов^_^