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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pictureBox и большая картинка? загрузка в pictureBox больших картинок 
:(
    Опции темы
myendlessness
Дата 22.9.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребята подскажите, пожалуйста, есть разного размера картинки, загружаю их в pictureBox и всё нормально, но как только пытаюсь загрузить большую картинку размером 222Мб выкидывает вот такую ошибку - "Недопустимый параметр" (System.ArgumentException)
вот код:
Код

  ofd.Title = "Open a Tiff File";
            ofd.Filter = "Tiff File (*.tif)|*.tif|All Files (*.*)|*.*";
           
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Form activeChildForm = this.ActiveMdiChild;
                if (activeChildForm != null)
                {
                    TextBox activeTextBox = (TextBox)activeChildForm.ActiveControl;
                    if (activeTextBox != null)
                        activeTextBox.Text = System.IO.File.ReadAllText(ofd.FileName);
                }
                using (Image origImg = Image.FromFile(ofd.FileName))
                {
                    pictureBox1.Image = new Bitmap(origImg);  - вот здесь программа вылетает
                }
            }



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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

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



А может лучше переписать в 
Код

pictureBox1.Image = Image.FromFile(ofd.FileName);


?

А виснет только при таком размере? Пробовали другие картинки в том-же формате но поменьше?

Это сообщение отредактировал(а) Crypton - 22.9.2009, 22:10
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
myendlessness
Дата 23.9.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 Crypton  
   Я загружал файлы этого же формата (Tif)  разного размера, например: 76Мб, 12Мб, 1Мб, 256Кб и все они работали нормально, не выдавало никаких ошибок. Не понял как именно Вы предлагаете переписать, если Вам не трудно покажите как именно Вы предлагаете изменить данную конструкцию с using:

Код

 using (Image origImg = Image.FromFile(ofd.FileName))
                {
                    pictureBox1.Image = new Bitmap(origImg);  - вот здесь программа вылетает
                }


Добавлено через 3 минуты и 11 секунд
Попробовал вот так, оно вообще вылетает!
Код

using (Image origImg = Image.FromFile(ofd.FileName))
                {
                    pictureBox1.Image = origImg;
                }

  Видимо это именно то, что Вы предлагали?
PM MAIL   Вверх
Ptica_Oz
  Дата 23.9.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



и мне, и мне помогите!    smile  

задача состряпать новый растр из старого + текст
пишу так:
Код

Bitmap image = new Bitmap(fileName);   //fileName - правильный, всё работает
int pageCount = image.GetFrameCount(FrameDimension.Page);  // растр может быть многолистовой
// дальше идут всякие мнипуляции для того что бы создать второе изображение, на котором будет текст
...
// создаём временный путь
            string tempPath = Path.GetTempPath();
            string stamperName = tempPath + Path.GetFileName(fileName);
            FileStream stream = new FileStream(stamperName, FileMode.Create);

            try
            {
                Bitmap stampedImage = null;

                // для каждого листа первого растра
                for (int i = 0; i < pageCount; i++)
                {
                    image.SelectActiveFrame(FrameDimension.Page, i);

                   // тут моё сознание помутнилось
                    Bitmap pageImage;
                    switch (image.PixelFormat)
                    {
                        case PixelFormat.DontCare:
                        case PixelFormat.Format1bppIndexed:
                        case PixelFormat.Format4bppIndexed:
                        case PixelFormat.Format8bppIndexed:
                        case PixelFormat.Format16bppGrayScale:
                        case PixelFormat.Format16bppArgb1555:
                        case PixelFormat.Indexed:
                            pageImage = new Bitmap(new Bitmap(image));   //!!!! вот, вот тут ошибка!

                            pageImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                            break;
                        default:
                            pageImage = image;
                            break;
                    }


ошибку выдаёт ту же "Недопустимый параметр".
тестирую на .tif разных размеров
есть подозрения, что сабака порылась в самих файлах, а размеры тут не причём, но не уверена

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

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



Немного погуглив выходит, что проблема при сжатии формата. Когда сохраняется в тиф, народ пишет что используется сжатие от jpeg, в следствии чего и вылетает такая вот ошибка. Это один вариант. Но вернемся к сабжу. Выходит, что все работает спокойно пока мы не перейдем определенный порог памяти (все-же загрузка картинки в обоих вариантах происходит сначала в память а потом уже дается ссылка на картинку к picturebox). Возможно просто происходит внутреннее переполнение буфера и GDI падает. Попробуйте сжать как-нибудь картинку и потом уже давать её picturebox. На крайняк попробуйте скомпилировать приложение под x64 (если система позволяет). Никогда с такой проблемой не сталкивался так что могу понаписать фигни еще тут smile
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
myendlessness
Дата 24.9.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Порылся в сети ничего внятного не нашёл, есть похожие проблемы, но  так же не было на них вразумительного ответа, либо это была проблема "пути", то есть файл не находился по заданному адресу! Но это не мой случай, однако, всё равно вылетает. 
PM MAIL   Вверх
Ptica_Oz
  Дата 29.9.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



попробовала так:
Код

Bitmap image = new Bitmap(fileName);
... 
Bitmap pageImage;
                   switch (image.PixelFormat)
                    {
                        case PixelFormat.DontCare:
                        case PixelFormat.Format1bppIndexed:
                        case PixelFormat.Format4bppIndexed:
                        case PixelFormat.Format8bppIndexed:
                        case PixelFormat.Format16bppGrayScale:
                        case PixelFormat.Format16bppArgb1555:
                            pageImage = new Bitmap(image.Width, image.Height, image.PixelFormat);
                            pageImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                            break;
                        case PixelFormat.Indexed:
                            pageImage = new Bitmap(image.Width, image.Height, PixelFormat.Format1bppIndexed);                            
                            pageImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                            break;
                        default:
                            pageImage = image;
                            break;
                    }
                    if (stampedImage == null)
                        stampedImage = pageImage;

                    Graphics gr = Graphics.FromImage(pageImage);
                    gr.DrawImageUnscaled(image, 0, 0);
                    gr.TranslateTransform(pageImage.Width - stampImage.Width - Margin, pageImage.Height - stampImage.Height - Margin);
                    gr.DrawImage(stampImage, 0, 0);
                    gr.ResetTransform();

теперь вылетает на строке "Graphics gr = Graphics.FromImage(pageImage);" со словами "Невозможно создать объект графики из изображения, имеющего формат с индексированными пикселами."
если pageImage создаю без указания формата пикселей, то ругается на строке "gr.DrawImageUnscaled(image, 0, 0);" со словами "Недостаточно памяти"

Да, ещё! я тестирую на разных файлах расширения .tif с разными сжатиями (CCITT Group 3, CCITT Group 4, ZIP, LZW и без сжатия) и разными физическими размерами рисунка (А1, А3, А4). ZIP вообще не берётся, никакой. остальные сжатия маленьких размеров (А4, А3) обрабатываются кодом из моего предыдущего поста, а А1 не может. Обращаю внимание, что размер занимаемой файлом памяти не играет роли. Тестила на 38Мб многостраничном файле А4 - работало!
яки будут пропозиции?

Это сообщение отредактировал(а) Ptica_Oz - 29.9.2009, 14:05
PM MAIL   Вверх
myendlessness
Дата 30.9.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 Ptica_Oz 
 38Мб это небольшой файл, у меня загружается и 76Мб нормально без проблем, а вот 222Мб уже не хочет. Правда я загружаю Tiff (без сжатия).
PM MAIL   Вверх
Ptica_Oz
  Дата 1.10.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile ну, вот, что у меня получилось...
Код

Bitmap image = new Bitmap(fileName);

            // создаём изображение со штрих-кодом
            System.Drawing.Image stampImage = GenerateStampImageWithResolution(code, image.VerticalResolution, image.HorizontalResolution);

            int pageCount = image.GetFrameCount(FrameDimension.Page);
            ImageFormat format = image.RawFormat;

            EncoderParameters multiFrameParam = new EncoderParameters(1);
            multiFrameParam.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
            EncoderParameters pageParam = new EncoderParameters(1);
            pageParam.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);

            // создаём временный путь
            string tempPath = Path.GetTempPath();
            string stamperName = tempPath + Path.GetFileName(fileName);
            FileStream stream = new FileStream(stamperName, FileMode.Create);

            try
            {
                Bitmap stampedImage = null;

                for (int i = 0; i < pageCount; i++)
                {
                    image.SelectActiveFrame(FrameDimension.Page, i);

                    Bitmap pageImage;
                   
// если картинка имеет индексированные пиксели, то избавляемся от них
//путём создания нового bitmap с указанием формата пикселей
// это нужно т.к. далее создаётся объект Graphics,
// а он не кушает индексированные пиксели
                    switch (image.PixelFormat)
                    {
                        case PixelFormat.DontCare:
                        case PixelFormat.Format1bppIndexed:
                        case PixelFormat.Format4bppIndexed:
                        case PixelFormat.Format8bppIndexed:
                        case PixelFormat.Format16bppGrayScale:
                        case PixelFormat.Format16bppArgb1555:
                        case PixelFormat.Indexed:
                            pageImage = new Bitmap(image.Width, image.Height, PixelFormat.Format16bppRgb565);
                            pageImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                            break;
                        default:
                            pageImage = image;
                            break;
                    }

                    try
                    {
                        Graphics gr = Graphics.FromImage(pageImage);
                        gr.DrawImageUnscaled(image, 0, 0);
                        gr.TranslateTransform(pageImage.Width - stampImage.Width - Margin, pageImage.Height - stampImage.Height - Margin);
                        gr.DrawImage(stampImage, 0, 0);
                        gr.ResetTransform();
                    }
                    catch (Exception ex)
                    {
                        Framework.Windows.ShowErrorBox("Ошибка при печати файла с кодом.", ex);
                        pageImage.Dispose();
                    }
                

                    if (format.Guid == ImageFormat.Tiff.Guid)
                    {
// это для многостраничных тифов
                        if (stampedImage == null)
                            stampedImage = pageImage;

                        if (i == 0)
                        {
                            stampedImage.Save(stream, getCodecForString("TIFF"), multiFrameParam);
                        }
                        else
                        {
                            stampedImage.SaveAdd(pageImage, pageParam);
                        }
                    }
                    else
                    {
                        pageImage.Save(stream, format);                        
                    }                                                        
                }
                stampedImage.Dispose();
            }
            catch(Exception ex)
            {
                Framework.Windows.ShowErrorBox("Ошибка при печати файла с кодом.", ex);
            }


этот пример создаёт новый файл во временной директории. В момент "gr.DrawImageUnscaled(image, 0, 0);" файл может принять очень большие размеры, т.ч. если на диске мало места, то будет вылизать ошибка "Недостаточно памяти".
Проверила на файле 65Мб - цветная 8-битная картинка без сжатия размером А1, сработало.
если у кого есть что сказать по этому поводу, говорите не стесняйтесь smile 
PM MAIL   Вверх
myendlessness
Дата 21.10.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня всё равно вылетает большая картинка 222Мб, ничего не мгу понять, вот привожу Disassembly может кто-то что-то подскажет
Код

            Application.EnableVisualStyles();
00000022  call        7A1B90B0 
00000027  nop              
            Application.SetCompatibleTextRenderingDefault(false);
00000028  xor         ecx,ecx 
0000002a  call        7A1B9180 
0000002f  nop              
            Application.Run(new Form1());
00000030  mov         ecx,945D44h 
00000035  call        78FACC65 
0000003a  mov         esi,eax 
0000003c  mov         ecx,esi 
0000003e  call        FFA7C230 
00000043  mov         ecx,esi 
00000045  call        7A199224 
0000004a  nop                        --------- вот в этом месте вылетает программа при загрузке изображения в PictureBox
        }
0000004b  nop              
0000004c  lea         esp,[ebp-0Ch] 


Загрузка изображения следующая
Код

using (Bitmap image = new Bitmap(ofd.FileName))
                {
                    pictureBox1.Image = image;
                }

PM MAIL   Вверх
myendlessness
Дата 21.10.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Посмотрел вообще ни одна картинка не зугружается сейчас!
Переписал загрузку
Код

 using (Image origImg = Image.FromFile(ofd.FileName))
                {
                    pictureBox1.Image = new Bitmap(origImg);
                }


 Теперь загружаются картинки нормально, только большая не загружается и вылетает вот здесь
Код

                    pictureBox1.Image = new Bitmap(origImg);
00000178  mov         ecx,7AE79C7Ch 
0000017d  call        78FA86D5 
00000182  mov         esi,eax 
00000184  mov         eax,dword ptr [ebp-3Ch] 
00000187  mov         edi,dword ptr [eax+00000184h] 
0000018d  mov         edx,dword ptr [ebp-4Ch] 
00000190  mov         ecx,esi 
00000192  call        79FEABB4 
00000197  mov         edx,esi                                      -----   вот здесь вылетает
00000199  mov         ecx,edi 
0000019b  cmp         dword ptr [ecx],ecx 
0000019d  call        7A7BCE6C 
000001a2  nop              
                }
000001a3  nop      


Пишет ошибку:

An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll
Additional information: Недопустимый параметр.

Это сообщение отредактировал(а) myendlessness - 21.10.2009, 12:45
PM MAIL   Вверх
Crypton
Дата 21.10.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

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



Цитата

Additional information: Недопустимый параметр.



Ошибки подобного типа происходят как раз в GDI а не в .net
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
myendlessness
Дата 21.10.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 Crypton 
Что это означает? Где нужно рыть чтобы понять?
PM MAIL   Вверх
Ptica_Oz
  Дата 22.10.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 myendlessness:
GDI не совершенен, может всё-таки дело в картинке?... поробуй проанализировать чем, кроме размера, она отличается от остальных...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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