Page 1 of 1

Convert Color BMP to Black & White

Posted: Fri Jun 20, 2003 8:23 am
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

Posted: Fri Jun 20, 2003 9:18 am
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 

Posted: Tue Jun 15, 2004 4:10 pm
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()

Posted: Tue Jun 15, 2004 4:28 pm
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..