Writing to an image

Started by Anonymous, September 04, 2005, 03:37:08 PM

Previous topic - Next topic

Anonymous

Hi, my latest project requires me to directly write to a picture control, writing pixels directly, although speed is not as much a concern.
As far as i see it, their are three ways to achieve this...
1) Use a third party DLL and suffer the pains of trying to implement it into a firefly app.
2) Write directly to the file and refresh the image on screen everytime i make a change
3) locate the image in memory and write to memory
The third scheme is far more appealing to me, though i have limited knowledge how to achieve it. I do have limited knowledge of the format of a BMP image. Would you have any suggestions?
note: i only require to write to bits, NOT to draw lines or fill areas.

TechSupport

Sorry, but I am not much help when it comes to this sort of thing. :( I have never had the need to deal directly with bitmaps at the bit/byte level.

Anonymous

Ok, i kind of thought this might be going a little too far. However, would you be able to tell me if (when i open a picture in a picture control) the picture resides in memory somewhere aswell as on the control?

TechSupport

Quote from: twilighte1... the picture resides in memory somewhere aswell as on the control?
If you look at the generated source code for the project you will see that the images are put into standard Windows STATIC controls (using an %STM_SETIMAGE message).

To retrieve the handle of the image you can use the following code:

   Local hImg As Dword
   
   hImg = SendMessage( HWND_FORM1_PICTURE1, %STM_GETIMAGE, %IMAGE_BITMAP, 0)
   
   MsgBox "Bitmap handle is:" & Str$(hImg)

Anonymous

Ok, that's cool. How do i set a new image (BMP Picture) into a picture control (at runtime) in the code?

TechSupport


   Local FF_zTempString As Asciiz * %MAX_PATH
   Local FF_RECT        As Rect  
   Local FF_hPicture    As Long

   FF_zTempString = "IMAGE_NAME"  '<--- you need to set this
   GetClientRect hWndControl, FF_RECT
   FF_hPicture = LoadImage(App.hInstance, FF_zTempString, %IMAGE_BITMAP, FF_RECT.nRight, FF_RECT.nBottom, %LR_SHARED)
   FF_hPicture = SendMessage( hWndControl, %STM_SETIMAGE, %IMAGE_BITMAP, FF_hPicture)
  'if an old image exists then delete it to avoid resource leak.
  If FF_hPicture Then DeleteObject FF_hPicture


You would need to define the "IMAGE_NAME" to whatever you wish to call the image. The image would reside in a resource file. If you want to load the image from a disk file then you would beed to modify the LoadImage function call to include the %LR_LOADFROMFILE flag:

   FF_zTempString = "mybitmap.bmp"
   GetClientRect hWndControl, FF_RECT
   FF_hPicture = LoadImage(App.hInstance, FF_zTempString, %IMAGE_BITMAP, FF_RECT.nRight, FF_RECT.nBottom, %LR_SHARED or %LR_LOADFROMFILE)
   FF_hPicture = SendMessage( hWndControl, %STM_SETIMAGE, %IMAGE_BITMAP, FF_hPicture)
  'if an old image exists then delete it to avoid resource leak.
  If FF_hPicture Then DeleteObject FF_hPicture


EDIT: Make sure to change the "hwndControl" to the hwnd of the picture control (e.g. HWND_FORM1_PICTURE1).

Anonymous