Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
1

Вставка сгенерированных изображений в datagridview (ошибка GDI+)

22.01.2016, 09:42. Показов 1044. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, прошу помочь разобраться

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

проблема: возникает ошибка:
Необработанное исключение типа "System.Runtime.InteropServices.ExternalException" в System.Drawing.dll

Дополнительные сведения: В GDI+ возникла ошибка общего вида.
Погуглив понял что надо обнулять графическую пмять через Dispose, но это тоже не помогло. обнулял в цикле после вставки сгенерированного изображения в ячейку датагрида


VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
    Dim img As Image
 
    Private Function drawcode(codeText As String) As Image
        Dim barcode = AxStrokeScribe1
        Dim S As String
        S = codeText ' передаю значение для генерации штрихкода
        barcode.Alphabet = enumAlphabet.CODE128
        barcode.CtlText = S
        If barcode.Error Then
            Microsoft.VisualBasic.MsgBox(barcode.ErrorDescription)
        Else
            img = barcode.GetPictureHandle(enumFormats.EMF, 80, 12) ' !!!!! Ругается тут
        End If
    End Function
 
'генерируем и вставляем в цикле изображения в ячейки датагрид
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        For Each dgwr As DataGridViewRow In DGV.Rows
            drawcode(dgwr.Cells.Item(15).Value)
            dgwr.Cells.Item(14).Value = New Bitmap(img)
        Next
    End Sub
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2016, 09:42
Ответы с готовыми решениями:

В GDI+ произошла ошибка общего вида при сохранении изображений из picturebox'a в файл
Опять не получается. Что посоветуете? Как все таки сделать сохранение изображений из picturebox'a в...

Изменение размера и сжатие изображений GDI+
Создал программку которая сжимает изображения в указанной папке и изменяет размер, в написании...

Вставка изображений в pictureBox и datagridview из базы данных
Здравствуйте! Ситуацию такая: в базе данных есть таблица с полем nvarchar и в нем хранятся НАЗВАНИЯ...

Вывод в браузер сгенерированных изображений при кодировке скрипта ютф-8
Допустим, я генерирую в php-скрипте какое-то изображение с помощью GD и вывожу его в браузер,...

10
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
22.01.2016, 19:52 2
1. Ошибка общего вида, из моей практики с GDI+, возникает зачастую при работе с объектом Graphics.
2. Не уверен, но понимает ли грид формат EMF?
0
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
22.01.2016, 20:04 3
Цитата Сообщение от laaagz Посмотреть сообщение
img = barcode.GetPictureHandle(enumFormats.EMF, 80, 12) ' !!!!! Ругается тут
End If
Да тут до грида дело не доходит...
0
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
22.01.2016, 20:34 4
Проясните плз, что есть AxStrokeScribe, и откуда он подцепляется. такого типа в VB.net я не увидел пока что. не смею утверждать что он не реализован, просто непонятно откуда он (пространство имен)
0
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
25.01.2016, 01:12 5
Разобрался с компонентом)

Попробуйте что-нибудь в виде

VB.NET
1
2
3
Dim asd As Image
asd = New Bitmap(80, 12)
asd=barcode.getpicturehhandle....

Добавлено через 3 часа 30 минут
Признаться честно, все одно не понял...

Скачал компонент. Подцепил. Скопипастил ваш код в форму. Все работает. Никакой ошибки общего вида не возникает.

Не уверен, но возможно дело в том что компонент я прицеплял через ссылки проекта, а потом добавлял его на панель элементов.
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
25.01.2016, 10:02  [ТС] 6
Winney, спасибо за совет, но не помогло. У меня при запуске дебага первые раза 3-4 тоже не вылетает эта ошибка, каждый раз сиу довольный что все заработало, после н-ой попытки запуска начинает вылетать. Всю голову сломал

Воспользовался другим компонентом чтобы упростить себе задачу, да и компонент новый фри.
В итоге остался датагрид, новый компонент и вот такой алгоритм ( вычитал где-то, что помогает когда файлы носят разные имена)
Т.е. теперь картинки генерируем с разными именами и сохраняем в отведенную директорию, потом эти картинки из директории вставляем в датагрид. Ошибка точно такая же.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        For Each dgwr As DataGridViewRow In DGV.Rows
            Dim b = New BarcodeLib.Barcode
            b.Encode(TYPE.CODE128, dgwr.Cells.Item(15).Value.ToString, 500, 100)
            Dim b_img As Image
            Dim imgname As String = "image_"
            b_img = New Bitmap(500, 100)
            b_img = b.EncodedImage
            b_img.Save("c:\Project\PrintBarPL\PrintBarPL\bin\Debug\Barcode" & dgwr.Cells.Item(15).Value & ".code128")
' ^^^^^^^^^^^^^^^^^^^^
' ругается теперь на этой строке. Ошибка та же.
'-------------------------------------
            b_img.Dispose()
            GC.Collect()
            imgname = "c:\Project\PrintBarPL\PrintBarPL\bin\Debug\Barcode" & dgwr.Cells.Item(15).Value & ".code128"
            dgwr.Cells.Item(14).Value = New Bitmap(imgname)
        Next
    End Sub
0
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
25.01.2016, 10:16 7
laaagz, у вас в имени пути после Barcode прошушен слэш.
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 24
25.01.2016, 13:17  [ТС] 8
Yury Komar, не пропущен, проверил...видимо копипаст как-то плохо прошел(слешы съедаются при фаст едите на форуме при обработке бб-кода). Спасибо за поправку. Ошибка GDI+

Такая конструкция тоже не работает:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        For Each dgwr As DataGridViewRow In DGV.Rows
            Dim b = New BarcodeLib.Barcode
            b.Encode(TYPE.CODE128, dgwr.Cells.Item(15).Value.ToString, 500, 100)
            Dim imgname As String = "image_"
            Graphics.FromImage(b.EncodedImage)
            b.EncodedImage.Save("c:\Project\PrintBarPL\PrintBarPL\bin\Debug\Barcode" & dgwr.Cells.Item(15).Value & ".code128")
            b.EncodedImage.Dispose()
            GC.Collect()
            imgname = "c:\Project\PrintBarPL\PrintBarPL\bin\Debug\Barcode" & dgwr.Cells.Item(15).Value & ".code128"
            dgwr.Cells.Item(14).Value = New Bitmap(imgname)
        Next
    End Sub
Добавлено через 2 часа 50 минут
Проблема частично решена.
Дело в том что ошибка возникает при попытке сделать запись в уже существующий файл.
Ошибку выдавало когда файл с таким же именем уже существовал.
Решилось созданием уникального ИД в имени изображения.

Осталось понять как после создания файла сделать так чтобы его "отпустило".
0
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
27.01.2016, 19:50 9
М... а зачем сохранять изображение на диск то??? Почему сразу не вставить созданное изображение (программно) в грид?
2
Модератор
Эксперт .NET
4205 / 3288 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
27.01.2016, 20:06 10
Winney, тоже верно )
0
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
27.01.2016, 20:30 11
laaagz, и мне кажется, ели еще убрать Dispose для EncodedImage, жизнь может наладиться) А может и нет) Ну для отладки уберите ка всех сборщиков мусора и освободителей ресурсов)))

P.S.: У колонки грида должен быть тип DataGridViewImageColumn.
0
27.01.2016, 20:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2016, 20:30
Помогаю со студенческими работами здесь

gdi+ и конейнер для хранения изображений
Хочу реализовать средствами winapi и gdi+ следующий функционал: 1. считывается изображение с...

Есть ли в WPF полноценная замена GDI+? Чтобы можно было всё, что можно в GDI+? Просто думаю углубляться в работу с изображениями в WPF или GDI.
Ну собственно весь вопрос в заголовке темы.

Вставка изображений
Господа знатоки, кто скажет, отчего Access 2010 при выводе формы либо отчета, вставленную картинку...

Вставка изображений
Проблема заключается в том, есть кусок карты, заместо зеленых полосок нужно вставить картинки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru