Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Jak uzyc .jpg do "bitblt'u "
Staszek




Typ: neutral
Postów: 46
Zarejestrowany: Dec 2003
Jak uzyc .jpg do "bitblt'u "

Jak w temacie ? Jak zamiast bmp uzyc jpg w bitblt?


_____________________________________________
PZdr. St ()

"Nie mysl jak napisac ! Mysl co napisac !" Swiete slowa .. Of corz moje =p

24-04-2005 16:29
Pokaż profil Staszek  Wyślij email do Staszek        2620939
Knight Lore''FC




Typ: neutral
Postów: 240
Zarejestrowany: Jan 2003

Wczytaj JPG do Picture i mozesz juz robic BitBlt

28-04-2005 01:12
Pokaż profil Knight Lore  Wyślij email do Knight Lore        1065423
Staszek




Typ: neutral
Postów: 46
Zarejestrowany: Dec 2003

tak, oczywiscie.
ale problem polega na tym, ze ja mam tylko uchwyty, nie moge miec tego w pictureboxie. mam uchwyty do bmp. a chcialbym do jpg. no i wlasnie nie wiem jak :-(


_____________________________________________
PZdr. St ()

"Nie mysl jak napisac ! Mysl co napisac !" Swiete slowa .. Of corz moje =p

28-04-2005 20:50
Pokaż profil Staszek  Wyślij email do Staszek        2620939
Knight Lore''FC




Typ: neutral
Postów: 240
Zarejestrowany: Jan 2003

NIE MA UCHWYTOW DO JPG...
Sam szukalem czegos takiego w necie, ale nie znalazlem (moza slabo szukalem - nie wiem)
Jedynym obejsciem jest chyba (tylko na taki pomysl wpadlem) konwersja w locie z JPG na BMP, wczytanie tego jako BMP i usuniecie pliku BMP.

Z ta konwersja z JPG na BMP tez nie jest tak latwo.

Najprosciej to wlasnie wczytanie do Picture, zapis jako BMP -> SavePicture,
Wczytanie BMP -> API ->LoadImage,
Usuniecie BMP -> Kill BMP

Problem pojawil sie przy DUZYCH obrazkach...

Dla tego do konwersji NIE uzywam obiektu Picture tylko OLE...

Dokladniej:
Standardowo zapis robi sie tak:
SavePicture Picture1.Picture, App.Path+"test.bmp"

Tyle, ze przed zapisem TRZEBA do Picture1 wczytac obrazek... I tu pojawia sie problem z iloscia pamieci. Picture nie lubi DUZYCH obrazkow...
Dla tego przyklad wczytania DOWOLNEGO obrazka (obslugiwanego przez OLE) i zapisania go jako BMP ->

w module:

Public Type GUID
  Data1    As Long
  Data2    As Integer
  Data3    As Integer
  Data4(7) As Byte
End Type

Public Declare Function OleLoadPicturePath Lib "oleaut32.dll" (ByVal szURLorPath As Long, _
                                                ByVal punkCaller As Long, _
                                                ByVal dwReserved As Long, _
                                                ByVal clrReserved As OLE_COLOR, _
                                                ByRef riid As GUID, _
                                                ByRef ppvRet As IPicture) As Long

Public Function LoadPictureX(ByVal strFileName As String) As Picture
    Dim IID  As GUID
    With IID
        .Data1 = &H7BF80980
        .Data2 = &HBF32
        .Data3 = &H101A
        .Data4(0) = &H8B
        .Data4(1) = &HBB
        .Data4(2) = &H0
        .Data4(3) = &HAA
        .Data4(4) = &H0
        .Data4(5) = &H30
        .Data4(6) = &HC
        .Data4(7) = &HAB
    End With
    On Error GoTo ERR_LINE
        OleLoadPicturePath StrPtr(strFileName), 0&, 0&, 0&, IID, LoadPictureX
        Exit Function
ERR_LINE:

    Set LoadPictureX = VB.LoadPicture(strFileName)
   
End Function

Wczytanie JPG i uzycie na nim BitBlt uzyskujesz poprzez:

w module:

Global hXBitmap As Long             
Global dXBitmap As Bitmap           
Global dcXBitmap As Long           

Public Type Bitmap
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type

Public Declare Function LoadImage Lib "user32" Alias "LoadImageA" _
                                              (ByVal hInst As Long, _
                                                ByVal lpsz As String, _
                                                ByVal un1 As Long, _
                                                ByVal n1 As Long, _
                                                ByVal n2 As Long, _
                                                ByVal un2 As Long) As Long

Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, _
                                                ByVal nCount As Long, _
                                                lpObject As Any) As Long

Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, _
                                                ByVal hObject As Long) As Long

---------------------------------------------

teraz:

Const LR_LOADFROMFILE = &H10
Const LR_CREATEDIBSECTION = &H2000

tmpPlikBMP=app.path+"\moj.jpg"

'wczytaj JPG i zapisz jako BMP
        SavePicture LoadPictureX(tmpPlikBMP), App.Path + "\~temp.bmp"

'nowy plik (po konwersji)
        tmpPlikBMP = App.Path + "\~temp.bmp"

'wczytuje BMP (po konwersji z JPG) 
    hXBitmap = LoadImage(ByVal 0&, tmpPlikBMP, 0, 0, 0, LR_LOADFROMFILE Or LR_CREATEDIBSECTION)
   
'usun BMP po konwersji
    'sprawdz czy plik istnieje -> jesli tak to usun go
    If sprawdz_plik(App.Path + "\~temp.bmp" ) Then
        Kill App.Path + "\~temp.bmp"
    End If
       
    If hXBitmap = 0 Then
        MsgBox "Load ERROR"
        Exit Sub
    End If
   
    'pobierz informacje ( wymiary )
    GetObject hXBitmap, Len(dXBitmap), dXBitmap
   
    'nowy DC dla obrazka X
    dcXBitmap = CreateCompatibleDC(GetDC(0))
   
    'podepnij pod dane z IMAGE uchwyt DC
    SelectObject dcXBitmap, hXBitmap

i w dcXBitmap masz uchwyt do twojego JPG (po konwersji do BMP), a w dXbitmap masz informacje o obrazku

Osobiscie uzywam tego do wczytywania obrazkow 15x21cm (1772x2480pix) i DZIALA
Ciekawostka... Do Picture nie idzie wczytac obrazka o tych wymiarach jako BMP, ale jako JPG idzie... CZEMU ?
I nie zapomnij usunac zasobow : hxBitmap i dcXbitmap

[Post edytowany dnia 29-04-2005 15:58 przez Knight Lore'FC]

29-04-2005 00:26
Pokaż profil Knight Lore  Wyślij email do Knight Lore        1065423
Wszystkich odpowiedzi: 3 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1