powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / GDI+ склеивание изображений на VB6
3 сообщений из 3, страница 1 из 1
GDI+ склеивание изображений на VB6
    #37989461
FeelYou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу ткнуть носом в ошибку или кинуть ссылку на работающий код именно на GDI+
Уже перепробовал все методы тыка, пример на дотнет переделать для vb не смог,
выручайте...

Код: vbnet
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.
42.
43.
44.
Public Declare Function GdipCreateBitmapFromScan0 Lib "gdiplus" _
(ByVal width As Long, ByVal height As Long, ByVal stride As Long, _
ByVal format As Long, ByVal scan0 As Long, ByRef bitmap As Long) As Long
Public Declare Function GdipGetImageGraphicsContext Lib "gdiplus" _
(ByVal image As Long, ByRef graphics As Long) As Long
Public Declare Function GdipGraphicsClear Lib "gdiplus" _
(ByVal graphics As Long, Optional ByVal color As Long = &HFFFFFFFF) As Long
Public Declare Function GdipCreateFromHDC Lib "gdiplus" _
(ByVal hdc As Long, graphics As Long) As Long
Public Declare Function GdipCreateBitmapFromGraphics Lib "gdiplus" _
(ByVal width As Long, ByVal height As Long, ByVal graphics As Long, bitmap As Long) As Long
Public Declare Function GdipLoadImageFromFile Lib "gdiplus" _
(ByVal filename As String, image As Long) As Long
Public Declare Function GdipDrawImageRect Lib "gdiplus" _
(ByVal graphics As Long, ByVal image As Long, ByVal x As Single, ByVal y As Single, _
ByVal width As Single, ByVal height As Single) As Long
Public Declare Function GdipSaveImageToFile Lib "gdiplus" _
(ByVal image As Long, ByVal filename As String, clsidEncoder As CLSID, _
encoderParams As Any) As Long

Private Sub ImgPlus() ' код упрощен для удобочитаемости
Dim Rez As Long, Enc As CLSID, BmpTo As Long, CntTo As Long, ImgFrom As Long, BmpFrom As Long

' создаю пустое изображение нужного размера с белой заливкой
Rez = GdipCreateBitmapFromScan0(200, 200, 200 * 3, PixelFormat24bppRGB, 0&, BmpTo)
Rez = GdipGetImageGraphicsContext(BmpTo, CntTo)
Rez = GdipGraphicsClear(CntTo, -1)

' накладываю готовую картинку с диска в левый верхний угол и сохраняю - так все работает, Rez=0
Rez = GdipCreateBitmapFromFile(StrConv("С:\from.bmp", vbUnicode), BmpFrom)
Rez = GdipDrawImageRect(CntTo, BmpFrom, 0, 0, 100, 100)
Rez = GetEncoderClsid("image/bmp", Enc)  
Rez = GdipSaveImageToFile(BmpTo, StrConv("С:\to.bmp", vbUnicode), Enc, ByVal 0)
Rez = GdipDisposeImage(BmpFrom)

' а вот так - не работает... а хотелось бы ))
Rez = GdipCreateFromHDC(Me.hdc, ImgFrom) ' или Rez = GdipCreateFromHWND(HwndMe, ImgFrom)
Rez = GdipCreateBitmapFromGraphics(100, 100, ImgFrom, BmpFrom)
Rez = GdipDrawImageRect(CntTo, BmpFrom, 0, 0, 100, 100) ' рисую именно на бланке, а не на HDC
Rez = GdipSaveImageToFile(BmpTo, StrConv("С:\to.bmp", vbUnicode), Enc, ByVal 0)
Rez = GdipDisposeImage(ImgFrom)
Rez = GdipDeleteGraphics(BmpFrom)
' на выходе просто белый фон, все Rez=0
 End Sub
...
Рейтинг: 0 / 0
GDI+ склеивание изображений на VB6
    #37990963
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FeelYou,

CLSID?
...
Рейтинг: 0 / 0
GDI+ склеивание изображений на VB6
    #37993793
FeelYou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CLSID - кодек изображения, я просто специально упростил листинг, чтобы непринципиальные вещи не отвлекали (при сохранении требуется узнать GUID конкретного формата png там или jpg)

Код: vbnet
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.
Public Type CLSID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(0 To 7) As Byte
End Type
Public Type ImageCodecInfo
   ClassID As CLSID
   FormatID As CLSID
   CodecName As Long
   DllName As Long
   FormatDescription As Long
   FilenameExtension As Long
   MimeType As Long
   Flags As ImageCodecFlags
   Version As Long
   SigCount As Long
   SigSize As Long
   SigPattern As Long
   SigMask As Long
End Type
Public Function DEFINE_GUID(ByVal sGuid As String) As CLSID
Call CLSIDFromString(StrPtr(sGuid), DEFINE_GUID)
End Function
End Type


ну и так далее Call GetEncoderClsid("image/bmp", encoderCLSID), не важно

Хотелось бы понять принцип:
GdipCreateBitmapFromScan0 возвращает Bitmap
GdipGetImageGraphicsContext возвращает Graphics указатель на Bitmap (на нем рисуем "BMP")

GdipCreateBitmapFrom возвращает Bitmap, который замечательно кладется на "BMP" при помощи GdipDrawImageRect
CreateFromHWND возвращает объект Graphics, Bitmap из него должен был получиться при помощи CreateBitmapFromGraphics - но там пусто! и не понятно чего нет - Graphics или Bitmap ?

Я кстати выкрутился из положения при помощи дополнительного "пустого" имиджа:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Declare Function GdipGetDC Lib "gdiplus" _
(ByVal graphics As Long, hdc As Long) As Long
Public Declare Function GdipReleaseDC Lib "gdiplus" _
(ByVal graphics As Long, ByVal hdc As Long) As Long
Public Declare Function PrintWindow Lib "user32" _
(ByVal hwnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long

Dim ImageTile As Long, GraphicsTile As Long, DCTile As Long
Rez = GdipCreateBitmapFromScan0(ScrWidth, ScrHeight, ScrWidth * 3, PixelFormat24bppRGB, 0, ImageTile)
Rez = GdipGetImageGraphicsContext(ImageTile, GraphicsTile)
Rez = GdipGetDC(GraphicsTile, DCTile)
Rez = PrintWindow(Me.HWND, DCTile, 0)
Rez = GdipReleaseDC(GraphicsTile, DCTile)


но осадочек остался ))
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / GDI+ склеивание изображений на VB6
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]