2015-10-25 3 views
0

Как сохранить сгенерированную миниатюру? Я получаю эту ошибку:Сохранение сгенерированного эскиза дает исключение для объекта, не заданное исключение

Object reference not set to an instance of an object

Это мой код. Я новичок в C#. Я нашел код генерации миниатюр онлайн, и я думал, что я мог бы использовать его, но его дает мне ошибку ...

//1. <lcFilename> as path of large size file. 
//2. <lnWidth> as width of required thumbnail. 
//3. <lnHeight> as height of required thumbnail. 
//The function returns a Bitmap object of the changed thumbnail image which you can save on the disk. 
public static Bitmap CreateThumbnail(string lcFilename, int lnWidth, int lnHeight) 
{ 
    System.Drawing.Bitmap bmpOut = null; 
    try 
    { 
     Bitmap loBMP = new Bitmap(lcFilename); 
     ImageFormat loFormat = loBMP.RawFormat; 

     decimal lnRatio; 
     int lnNewWidth = 0; 
     int lnNewHeight = 0; 

     //*** If the image is smaller than a thumbnail just return it 
     if (loBMP.Width < lnWidth && loBMP.Height < lnHeight) 
      return loBMP; 

     if (loBMP.Width > loBMP.Height) 
     { 
      lnRatio = (decimal)lnWidth/loBMP.Width; 
      lnNewWidth = lnWidth; 
      decimal lnTemp = loBMP.Height * lnRatio; 
      lnNewHeight = (int)lnTemp; 
     } 
     else 
     { 
      lnRatio = (decimal)lnHeight/loBMP.Height; 
      lnNewHeight = lnHeight; 
      decimal lnTemp = loBMP.Width * lnRatio; 
      lnNewWidth = (int)lnTemp; 
     } 
     bmpOut = new Bitmap(lnNewWidth, lnNewHeight); 
     Graphics g = Graphics.FromImage(bmpOut); 
     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     g.FillRectangle(Brushes.White, 0, 0, lnNewWidth, lnNewHeight); 
     g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight); 

     loBMP.Dispose(); 
    } 
    catch 
    { 
     return null; 
    } 

    return bmpOut; 
} 
        // Thumbnail Generate 
        string largefilepath = "images/" + imageuploaded; 
        string largefilepath2 = "images/users/" + imageuploaded + "-160x160"; 
        Bitmap bmp1 = new Bitmap(CreateThumbnail(largefilepath, 160, 160)); 
        bmp1.Save(largefilepath2); 
+0

Для документирования ваших методов необходимо использовать надлежащие комментарии XML. –

+1

На какой линии вы получили такую ​​ошибку? –

ответ

-1

Вы должны Dispose ваш Graphics после того, как закончит свою работу. Когда вы рисуете что-то на изображении с Graphics, обычно используется блок using, но поскольку он уже находится в области try/catch, он кажется лишним здесь.

//1. <lcFilename> as path of large size file. 
//2. <lnWidth> as width of required thumbnail. 
//3. <lnHeight> as height of required thumbnail. 
//The function returns a Bitmap object of the changed thumbnail image which you can save on the disk. 
public static Bitmap CreateThumbnail(string lcFilename, int lnWidth, int lnHeight) 
{ 
    System.Drawing.Bitmap bmpOut = null; 
    try 
    { 
     Bitmap loBMP = new Bitmap(lcFilename); 
     ImageFormat loFormat = loBMP.RawFormat; 

     decimal lnRatio; 
     int lnNewWidth = 0; 
     int lnNewHeight = 0; 

     //*** If the image is smaller than a thumbnail just return it 
     if (loBMP.Width < lnWidth && loBMP.Height < lnHeight) 
      return loBMP; 

     if (loBMP.Width > loBMP.Height) 
     { 
      lnRatio = (decimal)lnWidth/loBMP.Width; 
      lnNewWidth = lnWidth; 
      decimal lnTemp = loBMP.Height * lnRatio; 
      lnNewHeight = (int)lnTemp; 
     } 
     else 
     { 
      lnRatio = (decimal)lnHeight/loBMP.Height; 
      lnNewHeight = lnHeight; 
      decimal lnTemp = loBMP.Width * lnRatio; 
      lnNewWidth = (int)lnTemp; 
     } 
     bmpOut = new Bitmap(lnNewWidth, lnNewHeight); 
     Graphics g = Graphics.FromImage(bmpOut); 
     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     g.FillRectangle(Brushes.White, 0, 0, lnNewWidth, lnNewHeight); 
     g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight); 

     // Dispose Graphics so that it releases all the resources it's holding to draw on that image. 
     g.Dispose(); 

     /* or you could use Graphics as below.. but it seems redundant, because it is already in the try/catch block. 
     using (Graphics g = Graphics.FromImage(bmpOut)) 
     { 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      g.FillRectangle(Brushes.White, 0, 0, lnNewWidth, lnNewHeight); 
      g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight); 
     } 
     */ 

     loBMP.Dispose(); 
    } 
    catch 
    { 
     return null; 
    } 

    return bmpOut; 
} 
        // Thumbnail Generate 
        string largefilepath = "images/" + imageuploaded; 
        string largefilepath2 = "images/users/" + imageuploaded + "-160x160"; 
        Bitmap bmp1 = new Bitmap(CreateThumbnail(largefilepath, 160, 160)); 
        bmp1.Save(largefilepath2); 
-1

Проблема в том, у вас есть try..catch внутри метода, и это глотает исключение, и вы возвращаете нуль оттуда, следовательно, исключение, которое вы сообщили.

Вариант 1 Мое предложение состоит в том, чтобы либо сделать что-либо, за исключением таких, как заносить в журнал, таким образом, вы знаете, что что-то пошло не так, как сейчас. И обрабатывать случай, когда нулевое значение может быть возвращено с помощью метода, а именно:

string largefilepath = "images/" + imageuploaded; 
    string largefilepath2 = "images/users/" + imageuploaded + "-160x160"; 
    Bitmap bmp1 = new Bitmap(CreateThumbnail(largefilepath, 160, 160)); 

    if (bmp1 == null) { 
     // there was an exception, check the logs 
    } 
    else { 
     bmp1.Save(largefilepath2); 
    } 

Вариант 2: Или полностью удалить попробуйте поймать из метода и переместить его следующим образом:

Примечания : следующий код предполагает, что вы удалили try ... catch из метода CreateThumbnail.

try { 
    //Where imageUploaded is the name of the image with the extension, e.g. "samplePic.jpg" 
    string largefilepath = @"c:\images\" + imageuploaded; 
    string largefilepath2 = @"c:\images\users\" + System.IO.Path.GetFileNameWithoutExtension(imageuploaded) + "-160x160" + System.IO.Path.GetExtension(largefilepath); 
    Bitmap bmp1 = new Bitmap(CreateThumbnail(largefilepath, 160, 160)); 
    bmp1.Save(largefilepath2); 
} 
catch (Exception ex) { 
    //do something with the exception 
} 
+0

Я попробовал второй вариант, и я получил сообщение «Parameter is not valid» ... попробовал отладку, но не могу по-прежнему указывать, где проблема ... пожалуйста, помогите, это мой первый проект в C# ... спасибо за ваш help –

+0

Я обновил образец кода, он работает. Оригинальный ответ ответил на ваш вопрос. После этого вы получили другую ошибку. В любом случае, я проверил код, и он работает. Пожалуйста, вы можете проверить это и сообщить нам значение imageUploaded, которое вы используете, а также использовать абсолютные пути. – Don