Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка и сохранение изображений, Ошибка при сохранении в тот же файл 
:(
    Опции темы
KLUBS
  Дата 31.1.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



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

Load
Код

 public void OpenFile()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            Metadata meta = null; 
            ofd.Title = "Program Open File";
            ofd.Filter = "Bitmap Files (*.bmp)|*.bmp|JPEG (*.jpg,*jpeg,*.jpe,*.jfif)|*.jpg;*.jpeg;*.jpe;*.jfif|GIF (*.gif)|*.gif|Icon (*.ico)|*.ico|Enhanced Meta File (*.emf)|*.emf|TIFF (*.tif,*.tiff)|*.tif;*.tiff|PNG (*.png)|*.png|All Image Files|*.bmp;*.jpg;*.jpeg;*.jpe;*.jfif;*.gif;*.tif;*.tiff;*.png;*.ico";
            ofd.FilterIndex = 8;

            if (ofd.ShowDialog() == DialogResult.OK)
            {

//Image - это объект класса Bitmap

                image = (Bitmap)Bitmap.FromFile(ofd.FileName);

                width = image.Width;
                height = image.Height;

                fileName = ofd.FileName;
            }
        }


Save
Код

public bool SaveFile()
        {
            if(fileName != null && image != null)
            {

                image.Save(fileName, image.RawFormat); - В этом месте вызывает ошибку "Общая ошибка GDI+
              
                return true;
            }
            return false;

        }


Не подскажете как загружать и сохранять изображение в тот же файл???
PM MAIL ICQ Skype   Вверх
tol05
Дата 31.1.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата

Image.Save Method (String, ImageFormat) 

Exceptions:

ArgumentNullException    filename or format is null.
 
ExternalException           The image was saved with the wrong image format. 
                                       -or- 
                                       The image was saved to the same file it was created from.

Цитата(KLUBS @  31.1.2008,  16:00 Найти цитируемый пост)
image = (Bitmap)Bitmap.FromFile(ofd.FileName);

где вызывается Dispose() для image? 
Здается мне, что именно эта строчка и лочит ресурс. Нужно считывать картинку в буфер (в поток или массив или еще куда) и освобождать ресурс, и потом только писать в него.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
KLUBS
  Дата 31.1.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



Цитата(tol05 @  31.1.2008,  17:24 Найти цитируемый пост)
где вызывается Dispose() для image?

Ой... вызывается при закрытии самой главной формы
Цитата(tol05 @  31.1.2008,  17:24 Найти цитируемый пост)
Нужно считывать картинку в буфер (в поток или массив или еще куда) и освобождать ресурс, и потом только писать в него.

Я же считываю в Bitmap а дальше просто с ней работаю.. изменяю пиксели, вот...
двое суток подряд бъюсь головой, уже по мойму все перепробовал.. никак не удается записать в исходный фалй :(

PM MAIL ICQ Skype   Вверх
KLUBS
  Дата 31.1.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



Нашел вот что: 

ПРЕДУПРЕЖДЕНИЕ

Метод Save() не сработает, если ему будет передано имя файла, уже открытого средствами GDI+. Это происходит, видимо, потому, что файл остается занятым вплоть до выполнения деструктора Bitmap.

Другая проблема возникнет, если файл доступен для записи, но имеет длину, превышающую результирующий размер изображения. Save() не производит усечения, и в конце файла останется "мусор".

Эти проблемы известны Microsoft. Вторая уже нашла отражение в Knowledge Base


Как загрузить Bitmap.. чтобы потом можно было его сохранить в исходный файл?))
PM MAIL ICQ Skype   Вверх
farad
Дата 31.1.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(KLUBS @  31.1.2008,  17:51 Найти цитируемый пост)
файл остается занятым вплоть до выполнения деструктора Bitmap.
и после тоже... возмжно освобождение происходит в деструкторе 

зы чем читаю, сам не знаю.  smile 
попробуй клонировать исходный битмап, потом вызвать Dispose() затем обнулить все ссылки на него и ввызвать GC.Collect(); и работай с клоном. должно помочь


Это сообщение отредактировал(а) farad - 31.1.2008, 18:05
PM MAIL   Вверх
KLUBS
  Дата 31.1.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



можешь написать подровнее что ты имеешь ввиду? исходники в первом посте, плииз
PM MAIL ICQ Skype   Вверх
farad
Дата 31.1.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(KLUBS @  31.1.2008,  18:05 Найти цитируемый пост)
можешь написать подровнее что ты имеешь ввиду?
 я выше исправления внес

PM MAIL   Вверх
KLUBS
  Дата 31.1.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



Цитата(farad @  31.1.2008,  18:01 Найти цитируемый пост)
попробуй клонировать исходный битмап, потом вызвать Dispose() затем обнулить все ссылки на него и ввызвать GC.Collect(); и работай с клоном. должно помочь


имеешь ввиду это: \\ поправь если не так
Код

Bitmap tmp = (Bitmap)imaeg.Clone();
image.Dispose();
//Ссылок больше нету вроде, он же только тут присваивается....
GC.Collect();
// GC.GetTotalMemory(true);???????????
 и как клона обратно в image пихать?? у меня весь код связан с image...


PM MAIL ICQ Skype   Вверх
farad
Дата 31.1.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



короче попробовал, че сам предложил - нефурычит - тажа ошибка. Не закрывается этот файл. Пробовал, через поток получить - тоже нифига, видимо FRomStream и FromFile как-то по разному читают. Остается одно - перед чтением файла, скопировать его во временный файл, прочитать этот временный файл, а потом уже сохранять как хочешь...
PM MAIL   Вверх
KLUBS
Дата 31.1.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



Я тоже так пробовал, вот что получилось: или я что то не так делаю???????

Скрин
PM MAIL ICQ Skype   Вверх
farad
Дата 31.1.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



все работает:
Код

            string fileName1=@"d:\1.jpg";
            string fileName2 = @"d:\tmpfile.jpg";
            File.Copy(fileName1, fileName2,true);
            Image bmp = Image.FromFile(fileName2);
            bmp.Save(fileName1);

PM MAIL   Вверх
KLUBS
Дата 31.1.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



Да, именно так и сделал smile))
просто нашел еще пару ошибок у Microsoft'a smile))

Добавлено через 7 минут и 54 секунды
Только еще маленькая проблемка))
когда этот файл надо удалять?)))
PM MAIL ICQ Skype   Вверх
farad
Дата 1.2.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(KLUBS @  31.1.2008,  22:40 Найти цитируемый пост)
когда этот файл надо удалять?
 яб создал спецальную папку для временных файлов и очищал бы ее когда файлы разлочатся.. Или при закрытии программы или если не прокатит то при повторном запуске..

PM MAIL   Вверх
KLUBS
Дата 1.2.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



Создать папку в дир. Temp ???
а как узнать когда файлы разлочаться?)
PM MAIL ICQ Skype   Вверх
Moid
Дата 24.4.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Как говорят: помахать кулаками после драки... или как-то так... smile

Сам щас сталкнулся с такой проблемой. Может кому пригодится:
Код

            Stream file = File.Open(@"F:\3\1.bmp", FileMode.Open);
            Bitmap bmp = (Bitmap)Bitmap.FromStream(file);
            file.Close();
            file.Dispose();
            //---
            pictureBox1.Image = bmp;


Дальше можно сохранять обычным способом:
Код

            bmp.Save("...");



--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.5658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.