Convert Color BMP to Black & White

Share your advanced PureBasic knowledge/code with the community.
ricardo
Addict
Addict
Posts: 2438
Joined: Fri Apr 25, 2003 7:06 pm
Location: Argentina

Convert Color BMP to Black & White

Post by ricardo »

Code updated for 5.20+

Code: Select all

;Black and White example by ricardo arias


#Image = 1

Procedure FX()
  MyImage = CreateImage(0, ImageWidth(#Image),ImageHeight(#Image))
  SetGadgetState(#Image,ImageID(#Image))
  StartDrawing(ImageOutput(0))
  hDC = GetDC_(GadgetID(#Image))
  For i = 0 To ImageHeight(0) - 1 
    For ii = 0 To ImageWidth(0) - 1
      Color =GetPixel_(hDC,ii,i)
      Temp = (Red(Color) + Green(Color) + Blue(Color))/3
      NewColor = RGB(Temp,Temp,Temp)
      Plot(ii, i, NewColor)
    Next ii
  Next i
  Beep_(1000,100)
  StopDrawing()
  SetGadgetState(#Image, ImageID(0))
  SaveImage(0, "Black&White.bmp", #PB_ImagePlugin_BMP)
EndProcedure

FileName$ = OpenFileRequester("Select a Bmp", "", "Bmp|*.bmp|", 0)
If FileName$
  LoadImage(#Image,FileName$)
  
  If OpenWindow(0,0,0,300,300,"B&W",#PB_Window_SystemMenu)
    ImageGadget(#Image,10,10,ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
    ButtonGadget(2,240,100,50,25,"B&W")
    Repeat
      EventID=WaitWindowEvent()
      
      Select EventID
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 2
              FX()
          EndSelect
          
      EndSelect
      
    Until EventID = #PB_Event_CloseWindow
  EndIf
EndIf
End
ARGENTINA WORLD CHAMPION
User avatar
Rings
Moderator
Moderator
Posts: 1435
Joined: Sat Apr 26, 2003 1:11 am

Post by Rings »

This is another example by Danilo, Its faster coz its using GetDIBITS and SETDIBITS.

Code: Select all

; by Danilo, 22.04.2003 - german forum 
; 
Procedure GrayImage(Number) 
  ;> 
  ;> Number     = ImageNumber 
  ;> 
  Structure _GI_BITMAPINFO 
    bmiHeader.BITMAPINFOHEADER 
    bmiColors.RGBQUAD[1] 
  EndStructure 

  Structure _GI_LONG 
   l.l 
  EndStructure 

  Structure _GI_BGR 
   R.b 
   G.b 
   B.b 
   A.b 
  EndStructure 

  hBmp = UseImage(Number) 
  If hBmp 
    hDC  = StartDrawing(ImageOutput()) 
    If hDC 
      ImageWidth  = ImageWidth() : ImageHeight = ImageHeight() 
      mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4) 
      If mem 
        bmi._GI_BITMAPINFO 
        bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER) 
        bmi\bmiheader\biWidth  = ImageWidth 
        bmi\bmiheader\biHeight = ImageHeight 
        bmi\bmiheader\biPlanes = 1 
        bmi\bmiheader\biBitCount = 32 
        bmi\bmiheader\biCompression = #BI_RGB 
        If GetDIBits_(hDC,hBmp,0,ImageHeight(),mem,bmi,#DIB_RGB_COLORS) <> 0 
          *pixels._GI_LONG = mem 
          *COLORS._GI_BGR   = mem 
          For a = 1 To ImageWidth*ImageHeight 
            ;color.b = Int((0.299* *COLORS\R) + (0.587* *COLORS\G) + (0.114* *COLORS\B)) 
       color.b = ((299 * *COLORS\R) + (587* *COLORS\G) + (114* *COLORS\B)) /1000
            *pixels\l = RGB(color,color,color) 
            *pixels + 4 
            *COLORS + 4 
          Next a 

          If SetDIBits_(hDC,hBmp,0,ImageHeight(),mem,bmi,#DIB_RGB_COLORS) <> 0 
            Result = hBmp 
          EndIf 
        EndIf 
        GlobalFree_(mem) 
      EndIf 
    EndIf 
    StopDrawing() 
  EndIf 
  ProcedureReturn Result 
EndProcedure 

UseJPEGImageDecoder() 
UsePNGImageDecoder() 
UseTIFFImageDecoder() 
UseTGAImageDecoder() 

;FileName$ = OpenFileRequester("SELECT IMAGE","","BMP|*.bmp",0) 
FileName$ = OpenFileRequester("SELECT IMAGE","","Image Files|*.bmp;*.jpg;*.jpeg;*.png;*.tiff;*.tga|All Files|*.*",0) 
;Filename$ = "Test.bmp" 

If FileName$ 
  If LoadImage(1,FileName$) 
    GrayImage(1) 
    OpenWindow(0,0,0,ImageWidth(),ImageHeight(),#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Image") 
      CreateGadgetList(WindowID()) 
      ImageGadget(0,0,0,ImageWidth(),ImageHeight(),ImageID()) 
    HideWindow(0,0):SetForegroundWindow_(WindowID()) 
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
  Else 
    MessageRequester("ERROR","Cant load image!",#MB_ICONERROR) 
  EndIf 
EndIf 
SPAMINATOR NR.1
KlintonWoo
User
User
Posts: 13
Joined: Wed Jun 02, 2004 10:10 am

Post by KlintonWoo »

Thats greyscale conversion...


Monochrome (turning the image to only black and white) would need you
to check if the pixel is over or under the middle of the RGB range..

Example would be;

Code: Select all

Image$="Test.bmp"
LoadImage(0,Image$)
Width=ImageWidth()
Height=ImageHeight()
StartDrawing(ImageOutput())
For X=0 to Width
For Y=0 to Height
col=Point(x,y)
if col<RGB(128,128,128)+1
Plot(x,y,0)
Else
Plot(x,y,Rgb(255,255,255))
Endif
Next
Next
StopDrawing()
Last edited by KlintonWoo on Tue Jun 15, 2004 4:32 pm, edited 1 time in total.
A mind once stretched by a new idea, never regains its original dimensions.
Edwin Knoppert
Addict
Addict
Posts: 1073
Joined: Fri Apr 25, 2003 11:13 pm
Location: Netherlands
Contact:

Post by Edwin Knoppert »

You can also try to blit to a compatible DC not using compatiblebitmap() on the same hDC but the memdc instead.
This will give you a black and white DC.
Migh tbe faster than..
Or molest the DIB values if 24bit directly, the fastest..
Post Reply