Сохранение изображения: в GDI + произошла общая ошибка. (Vb.net) - PullRequest
3 голосов
/ 12 января 2010

Мне нужно сохранить изображение после его открытия из OFD. Это мой код атм:

Dim ofd As New OpenFileDialog
ofd.Multiselect = True
ofd.ShowDialog()


For Each File In ofd.FileNames
   Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png)
Next

А в строке Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png) появляется ошибка.

(примечание: приложение будет построено, так что это всего лишь мой первый код, и его нужно будет сохранять, а не копировать)

Ответы [ 4 ]

16 голосов
/ 12 января 2010

Я бы проверил две вещи:

  1. Что каталог, в который вы сохраняете, существует
  2. Что у вас есть права на запись в этот каталог
6 голосов
/ 12 января 2010

Открытие или сохранение изображения блокирует файл. Перезапись этого файла требует, чтобы вы сначала вызвали Dispose () для объекта Image, который содержит блокировку.

Я не совсем понимаю ваш код, но вам придется сделать это следующим образом:

    For Each File In ofd.FileNames
        Using img As Image = Image.FromFile(File)
            img.Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.Png)
        End Using
    Next

Оператор Using обеспечивает удаление объекта img и снятие блокировки файла.

1 голос
/ 04 января 2013

Изображение ставит блокировку.

Например, я использовал этот буфер для сохранения в памяти.

byte[] ImageData = new Byte[0];
if (BackGroundImage != null)
    {
        Bitmap BufferImage = new Bitmap(BackGroundImage);
        MemoryStream ImageStream = new MemoryStream();
        BufferImage.Save(ImageStream, ImageFormat.Jpeg);
        BufferImage.Dispose();
        ImageData = ImageStream.ToArray();
        ImageStream.Dispose();


        //write the length of the image data...if zero, the deserialier won't load any image
        DataStream.Write(ImageData.Length);
        DataStream.Write(ImageData, 0, ImageData.Length);
    }
    else
    {
        DataStream.Write(ImageData.Length);
    }
0 голосов
/ 07 февраля 2013

Одной из причин этого является то, что поток (MemoryStream или любой другой поток), из которого вы загрузили основное изображение, был удален!

Такой вот случай:

Это метод расширения, который преобразует байтовый массив в растровое изображение, но использование оператора будет распоряжаться потоком памяти, это всегда будет вызывать эту ошибку:

    public static Bitmap ToBitmap(this byte[] bytes)
    {
        if (bytes == null)
        {
            return null;
        }
        else
        {
            using(MemoryStream ms = new MemoryStream(bytes))
            {
                return new Bitmap(ms);
            }
        }
    }
...