|
Contantes y Apis
-------------------
Public Const SRCCOPY As Integer = &HCC0020
Public Const SRCINVERT As Integer = &H660046
Public Const SRCAND As Integer = &H8800C6
...
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
Function
-------------------
Public Sub BitBlt2(ByRef Destino As PictureBox, ByVal dX As Integer, ByVal dY As Integer, ByVal dW As Integer, ByVal dH As Integer, ByVal Origen As PictureBox, ByVal sX As Integer, ByVal sY As Integer, ByVal Flag As Integer)
Dim srcPic As Graphics = Destino.CreateGraphics 'Get a Graphics Object from the form
Dim orgPic As Graphics = Origen.CreateGraphics 'Get a Graphics Object from the to
Dim srcBmp As New Bitmap(src.Width, src.Height, srcPic) 'Create a EMPTY bitmap from that graphics
Dim srcMem As Graphics = Graphics.FromImage(srcBmp) 'Create a Graphics object in memory from that bitmap
Dim HDC1 As IntPtr = orgPic.GetHdc 'get the IntPtr's of the graphics
Dim HDC2 As IntPtr = srcMem.GetHdc 'get the IntPtr's of the graphics
'Set the picture
BitBlt(HDC2, dX, dY, dW, dH, HDC1, sX, sY, Flag)
'Clone the bitmap so we can dispose this one
If Not Destino.Image Is Nothing Then Destino.Image.Dispose()
Destino.Image = srcBmp.Clone
'Clean Up
orgPic.ReleaseHdc(HDC1)
orgPic.Dispose()
srcPic.Dispose()
srcMem.ReleaseHdc(HDC2)
srcMem.Dispose()
srcBmp.Dispose()
End Sub
Codigo a insertar (From, Control, class..)
-----------------------------------------------
Dest = Picturebox a recibir el dibujo.
Src = Picturbox con imagen.
Mask 0 Picturebox con imagen.
BitBlt2(dest, 0, 0, 47, 47, Src, 0, 0, SRCAND)
BitBlt2(dest, 0, 0, 47, 47, Mask, 0, 0, SRCINVERT)
Gracias a Matthew Hazlett.
|
|
|
|
|
hello,
I have a image in picturebox, and the other image in the background of the picturebox.
the background image is the same image which is in picturebox1.image but it is coloured with block of dark colors for each parts.
now if i click on the picture box , i have given the code to retrive the color (ARGB) of background image where i clicked and then i have to colour the foreground image with the selected color from palette ,
but its coloring the background itself
...
i am using this code...
for coloring
Private Sub DoFill(ByVal sender As Object, ByVal ea As EventArgs)
' translate point to client co-ordinates
Dim pt As Point = m_pb.PointToClient(Control.MousePosition)
Dim x As Integer = pt.X
Dim y As Integer = pt.Y
Dim hDC1, hDC, hBrush As IntPtr
Dim g As Graphics = m_pb.CreateGraphics()
' get color of pixel clicked on
Dim clr As Color = CType(m_pb.BackgroundImage, Bitmap).GetPixel(x, y)
Dim cl As Color = CType(m_pb.Image, Bitmap).GetPixel(x, y)
Dim gdi_clr As Color = Color.FromArgb(0, clr.B, clr.G, clr.R)
Dim gdi_cl As Color = Color.FromArgb(0, cl.B, cl.G, cl.R)
Try
' get our device context
hDC = g.GetHdc()
' create a solid brush
' NOTE: When using GDI, pass "A,B,G,R" to Color.FromARGB()
hBrush = CreateSolidBrush(Color.FromArgb(0, 0, 0, 255).ToArgb())
' select into the DC
Dim last As IntPtr = SelectObject(hDC, hBrush)
' fill it
ExtFloodFill(hDC, x, y, gdi_clr.ToArgb(), FLOODFILLSURFACE)
' restore last object
SelectObject(hDC, last)
' delete the brush
DeleteObject(hBrush)
'Catch e As Exception
'Throw (e)
Finally
' release the DC and dispose of the object
g.ReleaseHdc(hDC)
g.Dispose()
End Try
End Sub
thanks a lot
|
|
|
|
|
I have copied all code down in a project but these bits are not 'liked'! Wiggly lines!
Dim bmp = CType(copyRect(src, _
New RectangleF(0, 0, 50, src.Height)), Bitmap)
dest.Image = bmp.CloneShorthand:
-or-
dest.Image = CType(copyRect(src, _
New RectangleF(0, 0, 50, src.Height)), Bitmap).Clone
It is in these bits of code where I, in my limited knowledge, get lost in not having come across those things before. I get 'scr' and 'dest' 'thrown out'. It may be a normal routine for those who have done it before so how do I get the image. I hope this hasn't sounded rude but I can't learn if I am not shown the way. Thank you. David.
|
|
|
|
|
I'm trying to create an exe to perform a screen capture for users with layered windows (this will be in a Yahoo! Widget that has screen capture functionality, with users that most-likely have Widgets on their desktop that they want captured.) I currently have a "working" C# executable, but it does a complete screen capture of the regularly layered windows, no Widgets. From my searching on the net, using BitBlt with the CaptureBlt constant included seems like the next avenue for experimentation, and this article seems to be the closest to what I need.
I'm now simply trying to convert the code above (as well as the code in the various source-code files) into a single .vb file (through notepad and the command prompt compiler) that can accept a filename/location as a command-line argument (once compiled obviously) to provide a location to save the image. However, I'm currently going nowhere fast and I am looking for some guidance (specifically towards what I should cut out since I don't need any forms or picture boxes, and then how to accept the command-line argument). Thank you.
-Meskibob
-- modified at 1:02 Friday 21st July, 2006
|
|
|
|
|
Hi,
if I copy and paste the function
Function copyRect and build
it breaks at the line
BitBlt(HDC2, 0, 0, rect.Width, _
rect.Height, HDC1, rect.X, rect.Y, 13369376)
with the error message
Value of type 'System.IntPtr' cannot be converted to 'Integer'.
Is it because my vb.net version is 2002?
Anyone have any ways around it?
Bill
|
|
|
|
|
This example project is great if I want to copy images a small number of times. If it is used repeatedly though I start to have problems with lack of memory and my whole system slows. e.g. if the second button is amended to copy the image 1000 times. Windows task manager shows large amounts of memory used that isnt released until the form is closed and the gdi objects count goes up to 2000+. I'm using Win 2000.
Does anyone know the reason for this?
(note: fixing the typo identified earlier has no effect on this)
Mike
|
|
|
|
|
Read the fix for memory leak message.
Most likely It's just a matter of disposing the objects.
Matthew Hazlett
|
|
|
|
|
This code helped me a lot solving a problem, creating a graphic and storing it in a bitmap.
I originally come from VC6++ and are used with CDCs. This looks quite similar and helped me a lot!
Thanks
Pin
|
|
|
|
|
is there a way to copy an image even it is not visible? like if it is out of the screen area or another window is above it. in this case the function shown here would copy the topmost window.
|
|
|
|
|
Hi, Did u ever find out how to copy the invisible/hidden area of screen ot bitmap or so ?
|
|
|
|
|
|
did u find how to copy the memeory bitmap use this method?
from vevi
|
|
|
|
|
Anyone knows how i can load an image from file(or create and draw in memory) and then use with BitBlt(NOT .DrawImage)?
cause i can't make it work...
Fade (Amit BS)
|
|
|
|
|
Hi,
could you load the image into a picturebox (maybe invisible) and bitblt
from there?
Bill
|
|
|
|
|
Yes and No, you can do Load images off screen and then bitblt from memory, but not from a picture box (and who wants too when they don't have to? )
what you need to do is create a bitmap in memory and get a dc for it - i'll show you:
<br />
' Creating Image object to hold the image in memory<br />
TextImage = New Bitmap(yourWidth,yourHeight)' <br />
Dim ImageGraphics As Graphics = Graphics.FromImage(TextImage) ' creating a graphics object to manipulate the image<br />
ImageGraphics.drawImage(...) ' load your image here<br />
' dispose of graphics object<br />
ImageGraphics.Dispose()<br />
<br />
' (Note : objSurfaceGraphics is a graphics object from the form or other object you want to draw on)<br />
objSurfaceDC = objSurfaceGraphics.GetHdc() ' creating a DC for the target surface, using the dc you want to paste on (it is also possible to use desktop's dc)<br />
' create a compatible dc for the surface - we will blit from there Dim MemDC As IntPtr = CreateCompatibleDC(objSurfaceDC)<br />
Dim OldHBitmap As IntPtr ' to hold the reference<br />
Dim HBitmap As IntPtr = TextImage.GetHbitmap ' get HBitmap<br />
OldHBitmap = SelectObject(MemDC, HBitmap) ' and assign to our newly created MemDC - note that SelectObject returns the previous used DC, we need to keep it for later dispose or we'll have a memory leak'*** do blitting here<br />
<br />
' now we dispose - to properly dispose of all do this:<br />
SelectObject(MemDC, OldHBitmap)<br />
DeleteObject(HBitmap)<br />
DeleteDC(MemDC)<br />
DeleteDC(OldHBitmap)<br />
if you still have problems email me
let me know if this works for you
Fade (Amit BS)
|
|
|
|
|
|
In the cleanup section I had:
srcPic.Dispose()
srcMem.Dispose()
srcMem.Dispose()
You need to change it to this:
srcPic.Dispose()
srcBMP.Dispose()
srcMem.Dispose()
It creaated a huge memoty leak on my system.
It will be ok if you fix that. oops
|
|
|
|
|
Make sure you fix your code, then send the zipped source to submit@codeproject.com. You shouldn't put the burden on other people to fix your bugs.
Also, it'd be good to document this in a History section (like most other articles) to document what changed about your article or code. A lot of people don't check the message section for updates because the updates are usually reflected in the article and sample code.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Have you compared the speed of a BitBlt to .Net's DrawImage method? I've been trying to find the time to do that. I was using DrawImage in an application and found it far too slow for doing any really serious graphics display. BitBlting in C++ was far faster, but I don't know if the speed issue has more to do with the inherent overhead of .Net or the DrawImage method itself.
|
|
|
|
|
Havn't compared them indepth but it's much faster.
|
|
|
|
|
uuuh... which ones faster? BitBlt or DrawImage?
|
|
|
|
|
BitBlt is ALOT faster
Fade (Amit BS)
|
|
|
|
|
Hardly faster when using the native GDI+ format (Format32bppPArgb). In that case I measure about 10 - 15% speed increase for the GDI BitBlt versus GDI+ DrawImage. Such a small gain is NOT worth digging into to GDI API for. Note that when using any other pixel format DrawImage becomes 2-3 times slower!!!!
Machine is a 1.7 GHz 512 MB Intel 850 Mobo running XP Pro SP2.
|
|
|
|
|