Ошибка GDI + - загрузка изображения в Asp.net. Студент [дубликат]

Это легко объясняется:

  1. Объявление функции (класс и т. д.) выполняется только один раз, создавая все объекты значения по умолчанию
  2. , все передается по ссылке

Итак:

def x(a=0, b=[], c=[], d=0):
    a = a + 1
    b = b + [1]
    c.append(1)
    print a, b, c
  1. a не изменяется - каждый вызов назначения создает новый объект int - печатается новый объект
  2. b не изменяется - новый массив создается из значения по умолчанию и печатается
  3. c изменения - операция выполняется на одном и том же объекте - и печатается
2
задан Mahendra Liya 8 October 2011 в 19:06
поделиться

2 ответа

Вместо записи непосредственно в файлы сохраните растровое изображение в MemoryStream, а затем сохраните содержимое потока на диск. Это старая известная проблема, и, честно говоря, я не помню всех подробностей, почему это так.

 MemoryStream mOutput = new MemoryStream();
 bmp.Save( mOutput, ImageFormat.Png );
 byte[] array = mOutput.ToArray();

 // do whatever you want with the byte[]

В вашем случае это может быть либо

private void UploadImage(string uploadedImage)
{
    // Convert Base64 String to byte[]
    byte[] imageBytes = Convert.FromBase64String(uploadedImage);

    string uploadPath = Server.MapPath("..\\uploads\\") + DateTime.Now.Ticks.ToString() + ".jpeg";

    // store the byte[] directly, without converting to Bitmap first 
    using ( FileStream fs = File.Create( uploadPath ) )
    using ( BinaryWriter bw = new BinaryWriter( fs ) )
       bw.Write( imageBytes );
}    

или

private void UploadImage(string uploadedImage)
{
    // Convert Base64 String to byte[]
    byte[] imageBytes = Convert.FromBase64String(uploadedImage);
    MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

    System.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)Image.FromStream(ms);

    string uploadPath = Server.MapPath("..\\uploads\\") + DateTime.Now.Ticks.ToString() + ".jpeg";
    ms.Close();

    // convert to image first and store it to disk
    using ( MemoryStream mOutput = new MemoryStream() )
    {  
        bitmap.Save( mOutput, System.Drawing.Imaging.ImageFormat.Jpeg);
        using ( FileStream fs = File.Create( uploadPath ) )
        using ( BinaryWriter bw = new BinaryWriter( fs ) )
            bw.Write( mOutput.ToArray() );
    }
}    
6
ответ дан Wiktor Zychla 21 August 2018 в 06:03
поделиться
  • 1
    Эй, спасибо за ваш ответ, я не могу изменить свой код, чтобы включить предложенную вами корректировку. Можете ли вы отправить предложение, изменив мой код. Спасибо заранее. – Mahendra Liya 8 October 2011 в 19:27
  • 2
    Спасибо, человек, первый вариант работал для меня. Ты спас мой день! Большое большое спасибо... :-) – Mahendra Liya 8 October 2011 в 19:53

Кроме того, я думаю, стоит отметить, что при использовании MemoryStream поток всегда должен быть закрыт, а метод сохранения ДОЛЖЕН быть вызван до закрытия потока

 byte[] byteBuffer = Convert.FromBase64String(Base64String);
 MemoryStream memoryStream = new MemoryStream(byteBuffer);
 memoryStream.Position = 0;
 Bitmap bmpReturn = (Bitmap)Bitmap.FromStream(memoryStream);
 bmpReturn.Save(PicPath, ImageFormat.Jpeg);
 memoryStream.Close();
0
ответ дан Fuvizzo 21 August 2018 в 06:03
поделиться
  • 1
    В вашем примере вы должны добавить try / finally, чтобы убедиться, что поток закрыт в случае исключения. В любом случае, вы всегда должны использовать оператор using для своих ресурсов! Они созданы для этого. – Vanice 20 June 2017 в 13:06
Другие вопросы по тегам:

Похожие вопросы: