WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

DllCall Information

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Stamp text on bitmaps


The attached script has two functions:

rgb() , to get a color value. i think it was posted by Ian

bmStampText() , writes text to a bitmap

only for bitmaps, i tried the pixie extender to work with a jpg uncompressing and compressing again but the results are not good, the text is corrupted due to the compression.

BMSTAMPTEXT.WBT

;Stamp text on bitmaps
;Guido 04/03

;-------------------------------------------------------------;
;RGB : Returns a color value                                  ;
;-------------------------------------------------------------;
;red   : intensity of red, from 0 to 255                      ;
;green : intensity of green, from 0 to 255                    ;
;blue  : intensity of blue, from 0 to 255                     ;
;-------------------------------------------------------------;
;Returns : A color value, to use with bmStampText()           ;
;-------------------------------------------------------------;
#definefunction rgb(red,green,blue)
  return ((red mod 256)+(green mod 256)*256+(blue mod 256)*256*256)
#endfunction

;---------------------------------------------------------------------;
;bmStampText : Stamps text over a bitmap file, creating a new bitmap. ;
;---------------------------------------------------------------------;
;x          : text x position in the bitmap                           ;
;y          : text y position in the bitmap                           ;
;color      : text color, returned by RGB()                           ;
;fheight    : font height                                             ;
;fweight    : weight of the font in the range 0 through 1000.         ;
;             For example, 400 is normal and 700 is bold.             ;
;             If this value is zero, a default weight is used.        ;
;fitalic    : Specifies an italic font if set to @TRUE.               ;
;funderline : Specifies an underlined font if set to @TRUE.           ;
;fstrikeout : Specifies a strikeout font if set to @TRUE.             ;
;fface      : Typeface name of the font. The length of this string    ;
;             must not exceed 32 characters.                          ;
;bmsource   : source bitmap                                           ;
;bmtarget   : target bitmap to create                                 ;
;---------------------------------------------------------------------;
;Returns    : bytes written to the target bytmap                      ;
;---------------------------------------------------------------------;
#definefunction bmStampText(x,y,color,text,fheight,fweight,fitalic,funderline,fstrikeout,fface,bmsource,bmtarget)
gdi32=dllload(strcat(dirwindows(1),"gdi32.dll"))
user32=dllload(strcat(dirwindows(1),"user32.dll"))

DIB_RGB_COLORS=0
BI_RGB=0

LR_LOADFROMFILE=16
IMAGE_BITMAP=0
LR_CREATEDIBSECTION=8192

szBITMAPINFOHEADER=40
szBITMAPFILEHEADER=14
szRGBQUAD=4

TRANSPARENT=1

hbm=dllcall(user32,long:"LoadImageA",long:0,lpstr:bmsource,long:IMAGE_BITMAP,long:0,long:0,long:LR_CREATEDIBSECTION|LR_LOADFROMFILE)
if hbm==0 ;error
  dllfree(gdi32)
  dllfree(user32)
  return
endif

;font
hfont=dllcall(gdi32,long:"CreateFontA",long:fheight,long:0,long:0,long:0,long:fweight,long:fitalic,long:funderline,long:fstrikeout,long:0,long:0,long:0,long:0,long:0,lpstr:fface)

;desktop DC
hwscreen=dllcall(user32,long:"GetDesktopWindow")
hdc=dllcall(user32,long:"GetDC",long:hwscreen)

;compatible memory DC
hmdc=dllcall(gdi32,long:"CreateCompatibleDC",long:hdc)

;font
dllcall(gdi32,long:"SelectObject",long:hmdc,long:hfont)
;background mode
dllcall(gdi32,long:"SetBkMode",long:hmdc,long:TRANSPARENT)
;text color
dllcall(gdi32,long:"SetTextColor",long:hmdc,long:color)

;bitmap
dllcall(gdi32,long:"SelectObject",long:hmdc,long:hbm)

;text
dllcall(gdi32,long:"TextOutA",long:hmdc,long:x,long:y,lpstr:text,long:strlen(text))

;write bitmap
;; ctsize=256 
szinfo=(szBITMAPINFOHEADER) ;;+(ctsize*szRGBQUAD)
info=binaryalloc(szinfo)
binarypoke4(info,0,szBITMAPINFOHEADER)

;fill BITMAPINFO
dllcall(gdi32,long:"GetDIBits",long:hdc,long:hbm,long:0,long:0,lpnull,lpbinary:info,long:DIB_RGB_COLORS)
binaryeodset(info,szinfo)

biBitCount=binarypeek2(info,14)

biSizeImage=binarypeek4(info,20)

binarypoke4(info,16,BI_RGB) ;biCompression

biHeight=binarypeek4(info,8)

select biBitCount
  case 4
    ctsize=16
    break

  case 8
    ctsize=256
    break

  case 16
    ctsize=0
    break

  case 24
    ctsize=0
    break

  case 32
    ctsize=0
    break
endselect

bits=binaryalloc(biSizeImage)

;get bitmap bits
dllcall(gdi32,long:"GetDIBits",long:hdc,long:hbm,long:0,long:biHeight,lpbinary:bits,lpbinary:info,long:DIB_RGB_COLORS)
binaryeodset(bits,biSizeImage)

finfo=binaryalloc(szBITMAPFILEHEADER)

binarypokestr(finfo,0,"BM") ;bfType
                    
bfOffBits=szBITMAPFILEHEADER+szBITMAPINFOHEADER+(szRGBQUAD*ctsize)
binarypoke4(finfo,10,bfOffBits) ;bfOffBits
binarypoke4(finfo,2,bfOffBits+biSizeImage) ;bfSize
;bfReserved1=0
;bfReserved2=0

a=BinaryWriteEx(finfo,0,bmtarget,0,szBITMAPFILEHEADER)
b=BinaryWriteEx(info,0,bmtarget,szBITMAPFILEHEADER,szBITMAPINFOHEADER+(szRGBQUAD*ctsize))
c=BinaryWriteEx(bits,0,bmtarget,szBITMAPFILEHEADER+szBITMAPINFOHEADER+(szRGBQUAD*ctsize),biSizeImage)

;free
binaryfree(finfo)
binaryfree(info)
binaryfree(bits)

dllcall(user32,long:"ReleaseDC",long:hwscreen,long:hdc)
dllcall(gdi32,long:"DeleteObject",long:hbm)
dllcall(gdi32,long:"DeleteObject",long:hfont)
dllcall(gdi32,long:"DeleteDC",long:hmdc)

dllfree(gdi32)
dllfree(user32)

return a+b+c
#endfunction


;------------------------------------------
;TEST
;------------------------------------------

;source="source.bmp"
;target="target.bmp"
;color=rgb(0,0,255) ;blue
;fheight=15
;fweight=800
;fitalic=1
;funderline=1
;fstrikeout=0
;fface="Verdana"
;text="Hello World !"
;
;r=bmStampText(10,10,color,text,fheight,fweight,fitalic,funderline,fstrikeout,fface,source,target)
;
;message(r,"done")

Article ID:   W15935
File Created: 2004:03:30:15:41:44
Last Updated: 2004:03:30:15:41:44