Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!

[es] :: .NET :: BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!

[ Pregleda: 4551 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.co.yu.



Profil

icon BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!25.11.2006. u 17:32 - pre 211 meseci
Kad u VB 2005 uz pomoc BitBlt pomeram sliku iz jednog u drugi picture box sve radi super ali kada hocu sliku iz memorije da prebacim u Picture box iscrtava mi se samo crno polje.
Sta ne valja u ovom kodu?

Code:

        Dim SlikaSrc As New Bitmap("test.bmp")                          'Slika koja ide u memoriju    
        Dim SlikaMem As Graphics = Graphics.FromImage(SlikaSrc)
        Dim HDC4 As IntPtr = SlikaMem.GetHdc

        Dim SlikaDestX As Graphics = SlikaDest.CreateGraphics    'SlikaDestX je PictureBox
        Dim HDC5 As IntPtr = SlikaDestX.GetHdc

                BitBlt(HDC5, 0, 0, 110, 300, HDC4, 0, 0, 13369376)


Pozdrav svima i unapred hvala
Hear all, trust nothing!
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.co.yu.



Profil

icon Re: BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!01.12.2006. u 12:23 - pre 211 meseci
Uspeo sam da dobijem odgovor na codeGuru, pa evo da postujem ako nekome zatreba
Ono sto je falilo u mom kodu je SelectObject, jos jedna funkcija iz gdi32.
Ovo je kompletni kod sa svim neophodnim deklaracijama.
Code:

    Private Declare Auto Function BitBlt Lib "gdi32.dll" (ByVal _
        hdcDest As IntPtr, ByVal nXDest As Integer, ByVal _
        nYDest As Integer, ByVal nWidth As Integer, ByVal _
        nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc _
        As Integer, ByVal nYSrc As Integer, ByVal dwRop As _
        System.Int32) As Boolean

    <System.Runtime.InteropServices.DllImport("gdi32")> _
    Shared Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
    End Function

    <System.Runtime.InteropServices.DllImport("gdi32")> _
    Shared Function DeleteObject(ByVal hObject As IntPtr) As Integer
    End Function

    Private Sub pictdest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pictdest.Click
        Dim PictSrc As New Bitmap("c:\test.bmp") 'Picture that goes from file to memory 
        Dim PictMem As Graphics = Graphics.FromImage(PictSrc)
        Dim HDC4 As IntPtr = PictMem.GetHdc

        SelectObject(HDC4, PictSrc.GetHbitmap)

        Dim PictDestX As Graphics = pictdest.CreateGraphics 'SlikaDest is PictureBox
        Dim HDC5 As IntPtr = PictDestX.GetHdc

        BitBlt(HDC5, 0, 0, 110, 300, HDC4, 0, 0, 13369376)

        PictMem.ReleaseHdc(HDC4)
        PictDestX.ReleaseHdc(HDC5)
        DeleteObject(PictSrc.GetHbitmap)
    End Sub

Pozdrav svima
Hear all, trust nothing!
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.co.yu.



Profil

icon Re: BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!04.12.2006. u 11:49 - pre 211 meseci
Zbog nekih bagova u VS 2005 ovo resenje proizvodi uzasan memory leak i posle 20-tak minuta crashuje aplikaciju ili cak i OS.
Uspeo sam jedva nekako da nadjem resenje za taj leak pa ako nekog interesuje mogu da prilagodim kod i da ga postavim ovde.
Hear all, trust nothing!
 
Odgovor na temu

Shevchenko
Nikola Vasiljevski

Član broj: 37756
Poruke: 218
*.dialup.neobee.net.

Sajt: www.vasiljevski.com


+2 Profil

icon Re: BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!04.12.2006. u 14:29 - pre 211 meseci
Mene interesuje :) Pa ako te ne mrzi mogao bi da postujes resenje tog problema
Shoot for the moon. Even if you miss, you'll land among the stars.
Les Brown
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.co.yu.



Profil

icon Re: BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!04.12.2006. u 16:06 - pre 211 meseci
Da bi ovo radilo na formi treba da bude Button1, Button2 i pictureBox "SlikaDest" i u direktorijumu odakle se staruje treba da bude slika.bmp

Trik koji sam uporebio je da se slika(ili slike) jednaput fiksira u memoriji i da se kasnije koristi nebrojeno puta jer iz nekog razloga nakon brisanja objekata memorija ostaje alocirana i dolazi do leak-a.

Ovo resenje je upotrebljivo samo ako se vise puta koriste iste slike u suprotnom je neupotrebljivo jer nisam provalio kako da nateram net da zaista oslobadja memoriju.
Druga losa strana ovog resenja je sto prvo mora da se pritisne button2 da bi uzeo HDC od picturebox-a sto ne moze da se ubaci u Form1_load a sto je u mom slucaju OK jer ionako odmah po startovanju programa moraju da se izaberu neke opcije.
Code:
Imports System
Public Class Form1

    Inherits System.Windows.Forms.Form

    Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
     ByVal hdcDest As IntPtr, _
     ByVal nXDest As Integer, _
     ByVal nYDest As Integer, _
     ByVal nWidth As Integer, _
     ByVal nHeight As Integer, _
     ByVal hdcSrc As IntPtr, _
     ByVal nXSrc As Integer, _
     ByVal nYSrc As Integer, _
     ByVal dwRop As Int32) As Boolean

    <System.Runtime.InteropServices.DllImport("gdi32")> _
    Shared Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
    End Function

    <System.Runtime.InteropServices.DllImport("gdi32")> _
    Shared Function DeleteObject(ByVal hObject As IntPtr) As Integer
    End Function

    Dim SlikaBase As New Bitmap("slika.bmp")
    Dim SlikaMem As Graphics = Graphics.FromImage(SlikaBase)
    Dim HDC4 As IntPtr = SlikaMem.GetHdc
    Dim HDC5 As IntPtr

    Dim flip As Boolean = False

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim n As Integer = 2400
        If flip Then
            Do
                BitBlt(HDC5, 0, 0, 110, 360, HDC4, 0, n, 13369376)
                n += -40
            Loop Until n <= -40
        Else : MsgBox("prvo mora da se pritisne taster Button2")
        End If

        'SlikaMem.ReleaseHdc(HDC4)          'OVO NE RADI
        'SlikaDestX.ReleaseHdc(HDC5)        'TJ NE OSLOBADJA UOPSTE MEMORIJU
        'SlikaMem.Dispose()                       'Da bi program radio ove linije ne smeju
        'SlikaDestX.Dispose()                     'ukljucene
        'DeleteObject(SlikaBase.GetHbitmap) 'jer ce izbrisati objekte
        'SlikaBase.Dispose()                       'ali na zalost nece osloboditi memoriju

    End Sub


    Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If flip = False Then
            Static Dim SlikaDestX As Graphics = SlikaDest.CreateGraphics
            HDC5 = SlikaDestX.GetHdc
            flip = True
        End If
    End Sub

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SelectObject(HDC4, SlikaBase.GetHbitmap)
    End Sub
End Class

Hear all, trust nothing!
 
Odgovor na temu

[es] :: .NET :: BitBlt iz PictureBox-a u PictureBox hoce a iz memorije u PictureBox NECE!!!

[ Pregleda: 4551 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.