С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22

Как записать изображение объекта Graphics в объект Image или Bimap средствами GDI+ ?

05.06.2020, 20:02. Показов 2287. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Появилась необходимость записать изображение объекта Graphics в объект Image или Bimap.
Как я понял, суть библиотеки GDI+ в рисовании или изменения объекта Graphics оставляя неизменным исходный объект Image или Bimap, что вполне логично, т.к. это позволяет не испортить исходное изображение.
Не нашёл функции подобной GdipDrawImageRect, позволяющей изменять содержимое объекта Graphics используя другой Graphics. Из объекта Graphics можно сделать объект Bitmap с помощью функции GdipCreateBitmapFromGraphics. Задача, после манипуляций с объектом Graphics переместить изменения в объект Bimap чтобы затем использовать его в функции GdipDrawImageRect. Возможно ли это сделать?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2020, 20:02
Ответы с готовыми решениями:

Отрисовка на Image линии средствами GDI+
Занимаюсь написанием класса, который использует GDI+ и столкнулся с проблемами. Смоделировал свой проект простеньким примером, который...

Как записать изображение в переменную image?
В listView должно программным образом добавляться изображение и два текста. Как в переменную Image вставить изображение? Пытался, но...

В экземпляре объекта не задана ссылка на объект при работе с Graphics
Собственно вопрос в самой шапке... Как можно исправить эту ошибку?

8
Эксперт по электронике
6533 / 3161 / 334
Регистрация: 28.10.2011
Сообщений: 12,417
Записей в блоге: 7
05.06.2020, 21:14
Цитата Сообщение от Argus19 Посмотреть сообщение
т.к. это позволяет не испортить исходное изображение.
Сделать копию и работать с ней, не затрагивая оригинал. Так всегда поступают в таких ситуациях.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
05.06.2020, 22:30
Цитата Сообщение от Argus19 Посмотреть сообщение
Появилась необходимость записать изображение объекта Graphics в объект Image или Bimap.
А сам Graphics как получен?

Цитата Сообщение от Argus19 Посмотреть сообщение
Из объекта Graphics можно сделать объект Bitmap с помощью функции GdipCreateBitmapFromGraphics. Задача, после манипуляций с объектом Graphics переместить изменения в объект Bimap чтобы затем использовать его в функции GdipDrawImageRect. Возможно ли это сделать?
А чем собственно GdipCreateBitmapFromGraphics не устраивает? Вообще еще можно просто создать Bitmap и получить Graphics связанный с ним. При отрисовке в этот Graphics все будет отображаться в этот Bitmap. См. функцию GdipGetImageGraphicsContext.
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
06.06.2020, 06:21  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
А сам Graphics как получен
Visual Basic
1
GdipCreateFromHDC Picturew.hdc, wgraphics
Цитата Сообщение от The trick Посмотреть сообщение
При отрисовке в этот Graphics все будет отображаться в этот Bitmap
Спасибо. Для функции GdipDrawImageRect вторым параметром используется "Указатель на объект Image". Вы писали, что
Image и Bitmap это одно и тоже
из чего следует, что вместо указателя на объект Image я могу использовать указатель на объект Bitmap. Это так?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
06.06.2020, 12:25
Цитата Сообщение от Argus19 Посмотреть сообщение
из чего следует, что вместо указателя на объект Image я могу использовать указатель на объект Bitmap. Это так?
Да.
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
06.06.2020, 17:19  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
А чем собственно GdipCreateBitmapFromGraphics не устраивает?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
 If GdipLoadImageFromFile(StrConv(App.Path & "\Êîò.jpg", vbUnicode), wimg) <> Ok Then
                MsgBox "Unable to open image"
'...............................
      GdipCreateFromHDC Picturew.hdc, wgraphics
      GdipCreateFromHDC Picture1.hdc, wgraphicsh 
      GdipGetImageHeight wimg, wHeight
      GdipGetImageWidth wimg, wWidth
      GdipCreateBitmapFromGraphics wWidth, wHeight, wgraphicsh, bmp
      GdipDrawImageRect wgraphicsh, wimg, (Picture1.ScaleWidth - wWidth) / 2, (Picture1.ScaleHeight - wHeight) / 2, wWidth, wHeight
'.................................
         Form1.Label1.Caption = GdipDrawImageRect(wgraphics, bmp, -wWidth / 2, -wHeight / 2, wWidth, wHeight)
Label1 = 0, т.е. функция завершилась успешно, но окно PictureBox белое, что, как я понимаю, означает, что созданный объект Bitmap не связан с объектом Graphics.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
06.06.2020, 18:35
Argus19, для копирования с DC на DC используй стандартные методы, либо GDI (StratchBlt, BitBlt)
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
06.06.2020, 18:56  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
для копирования с DC на DC используй стандартные методы, либо GDI (StratchBlt, BitBlt)
Я и так это делаю. Для вращения использую часть кода из вашего примера
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function inflict(method)
                       GdipDrawImageRect graphics, img, 0, 0, iWidth * 1.2, iHeight * 1.2     'Переписываем редактируемое изображение
GdipRotateWorldTransform wgraphics, Form1.Angle.Value, MatrixOrderAppend
'Определяем точку вращения
 GdipTranslateWorldTransform wgraphics, Form1.Picturew.ScaleWidth / 2, Form1.Picturew.ScaleHeight / 2, MatrixOrderAppend
    GdipGraphicsClear wgraphics, &HFFFFFFFF
         '  GdipDrawImageRect wgraphics, wimg, -wWidth / 2, -wHeight / 2, wWidth, wHeight       так работает
         Form1.Label1.Caption = GdipDrawImageRect(wgraphics, bmp, -wWidth / 2, -wHeight / 2, wWidth, wHeight)   'так не работает
         'Form1.Label1.Caption = GdipDrawImageRect(wgraphics, wgraphicsh, -wWidth / 2, -wHeight / 2, wWidth, wHeight)   и так не работает
 
       GdipResetWorldTransform wgraphics
      Form1.Picturew.Refresh
      BitBlt Form1.Picturedit.hdc, (iWidth * 1.2 - wWidth) / 2, (iHeight * 1.2 - wHeight) / 2, wWidth, wHeight, Form1.Picturew.hdc, 0, 0, method
 
     Form1.Picturedit.Refresh
End Function
Задача - копировать функцией BitBlt изображение с изменённой яркостью, которое меняется в дополнительном PictureBox и вращается в PictureBox объекта wgraphics. Как сделать и вращение и изменение яркости в одном PictureBox пока не сообразил.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
07.06.2020, 10:39
Лучший ответ Сообщение было отмечено Argus19 как решение

Решение

Цитата Сообщение от Argus19 Посмотреть сообщение
Задача - копировать функцией BitBlt изображение с изменённой яркостью, которое меняется в дополнительном PictureBox и вращается в PictureBox объекта wgraphics. Как сделать и вращение и изменение яркости в одном PictureBox пока не сообразил.
Используй ImageAttributes:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Option Explicit
 
Private Sub Form_Load()
    Dim hToken      As Long
    Dim tGpInput    As GdiplusStartupInput
    Dim hGraphics   As Long
    Dim hImage      As Long
    Dim hAttr       As Long
    Dim tMtx        As ColorMatrix
    Dim lWidth      As Long
    Dim lHeight     As Long
    Dim fBright     As Single
    Dim fBrightness As Single
    
    tGpInput.GdiplusVersion = 1
    
    GdiplusStartup hToken, tGpInput
    GdipCreateFromHDC Picture1.hDC, hGraphics
    GdipLoadImageFromFile App.Path & "\Lenna-Forsen.jpg", hImage
    GdipGetImageWidth hImage, lWidth
    GdipGetImageHeight hImage, lHeight
    GdipCreateImageAttributes hAttr
    
    fBrightness = 1.5
    fBright = fBrightness - 1
    
    tMtx.m(0, 0) = 1: tMtx.m(1, 1) = 1:   tMtx.m(2, 2) = 1:   tMtx.m(3, 3) = 1:   tMtx.m(4, 4) = 1
    tMtx.m(0, 4) = fBright: tMtx.m(1, 4) = fBright: tMtx.m(2, 4) = fBright
    
    GdipSetImageAttributesColorMatrix hAttr, ColorAdjustTypeDefault, 1, tMtx, tMtx, ColorMatrixFlagsDefault
    GdipTranslateWorldTransform hGraphics, -lWidth / 2, -lHeight / 2, MatrixOrderAppend
    GdipRotateWorldTransform hGraphics, 45, MatrixOrderAppend
    GdipTranslateWorldTransform hGraphics, 180, 180, MatrixOrderAppend
    GdipDrawImageRectRectI hGraphics, hImage, 0, 0, lWidth, lHeight, 0, 0, lWidth, lHeight, UnitPixel, hAttr
    
    GdipDeleteGraphics hGraphics
    GdipDisposeImageAttributes hAttr
    GdipDisposeImage hImage
    GdiplusShutdown hToken
        
End Sub
Вложения
Тип файла: zip RotBrightGDI+.zip (13.1 Кб, 25 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2020, 10:39
Помогаю со студенческими работами здесь

Загрузить изображение из ресурсов в объект Image
Нужно загрузить изображение из ресурсов в объект Image. Добавлено через 30 секунд И в Grid...

Как сохранить объект java.awt.Image в jpg, gif или другой формат по выбору?
Имеется объект java.awt.Image Как сохранить его в jpg, gif или другой формат по выбору?

Преобразовать объект gtk.Image или gtk.gdb.Pixbuf в PIL.Image
Делаем скриншот, дальше требуется его обрезать/перерисовать/еще что нибудь, в gtk.image таких функций не нашел, единственная похожая...

Как поместить объект выше или ниже другого объекта
По аналогии со слоями в фотошопе - как поместить первый объект над- или под- вторым? Например растровое изображение использовать как фон.

Заливка средствами GDI+ как в paint
как можно при помощи GDI+ залить область, ограниченную кривыми, как в paint?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru