Solved

Picture Binarization problem

Posted on 2006-06-22
11
383 Views
Last Modified: 2008-02-01
Hi,
  I would like to load a picture and convert into binary image
I can load the picture and convert but cannot save.  what 's wrong?

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdLoad_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdLoad.Click
            
        Dim hDC As Integer
            CommonDialog1.Filter = "(*.bmp;*.ico;*.gif;*.jpg)|*.bmp;*.ico;*.gif;*.jpg"
            CommonDialog1.ShowOpen()
            
            sFile = CommonDialog1.FileName
            
            If sFile <> "" Then
                  Picture1.Image = System.Drawing.Image.FromFile(sFile)
            'hDCSour = CreateCompatibleDC(Picture1.Handle)
            hDCSour = CreateCompatibleDC(hDC)

            hBMPSour = CreateCompatibleBitmap(hDC, Picture1.ClientRectangle.Width, Picture1.ClientRectangle.Height)
            hDCDest = CreateCompatibleDC(hDC)
            hBMPDest = CreateCompatibleBitmap(hDC, Picture1.ClientRectangle.Width, Picture1.ClientRectangle.Height)
                  
                  SelectObject(hDCSour, hBMPSour)
                  SelectObject(hDCDest, hBMPDest)
                  
            '  BitBlt(hDCSour, 0, 0, Picture1.ClientRectangle.Width, Picture1.ClientRectangle.Height, hDC, 0, 0, vbSrcCopy)
            BitBlt(hDCDest, 0, 0, Picture1.ClientRectangle.Width, Picture1.ClientRectangle.Height, hDCSour, 0, 0, SRCCOPY)
                  
            End If
      End Sub
      
      Private Sub cmdSave_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdSave.Click
            'stores the counter value
            Static a As Integer
            a = a + 1
            Picture1.Image.Save(VB6.GetPath & "\pict" & a & ".bmp")
      End Sub

      
      Sub Grayscaling(ByRef pfIndex As Short)
        Dim pX, pY, hDC As Integer
            Dim x, y As Integer
            Dim colorval As Integer
            Dim green, red, blue As Integer
            Dim green2, red2, blue2 As Integer
            
            pX = Picture1.ClientRectangle.Width - 1
            pY = Picture1.ClientRectangle.Height - 1
            
            'loop through each pixel
            For x = 0 To pX
                  For y = 0 To pY
                        colorval = GetPixel(hDCSour, x, y)
                        
                If colorval >= 128 Then red2 = 255
                If colorval < 128 Then red2 = 0
                green2 = red2
                blue2 = red2


                SetPixel(hDCDest, x, y, RGB(red2, green2, blue2))
            Next y
            Next x
        BitBlt(hDCDes, 0, 0, Picture1.ClientRectangle.Width, Picture1.ClientRectangle.Height, hDCSour, 0, 0, SRCCOPY)
            Picture1.Refresh()
            
      End Sub
      
      Private Sub Form1_Closed(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Closed
            DeleteObject(hBMPSour)
            DeleteDC(hDCSour)
            DeleteObject(hBMPDest)
            DeleteDC(hDCDest)
      End Sub


0
Comment
Question by:gorexy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 3
  • +1
11 Comments
 
LVL 11

Expert Comment

by:LordWabbit
ID: 16958582
Whats the error message returned?
Try changing
Picture1.Image.Save(VB6.GetPath & "\pict" & a & ".bmp")
to
Picture1.Image.Save(Application.StartupPath & "\pict" & a & ".bmp")

Also try placing a breakpoint to check that the path and filename are valid
0
 

Author Comment

by:gorexy
ID: 16958874
no errors just it cannot produce the BMP file
0
 
LVL 11

Expert Comment

by:LordWabbit
ID: 16959103
Mmmmm, the code in the cmdSave

          'stores the counter value
          Static a As Integer
          a = a + 1
          Picture1.Image.Save(VB6.GetPath & "\pict" & a & ".bmp")

a will always be 1, are you not simply overwriting the file (IS there a pict1.bmp file in the destination path?)
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 11

Expert Comment

by:LordWabbit
ID: 16959162
Ooops my bad it was declared static (didn't see that)
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 16960780
This definitely looks like VB6 code ported over to VB.Net.

I haven't analyzed the code in depth...but I'm pretty sure you can achieve what you need using ALL native .Net code:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OpenFileDialog1.Filter = "(*.bmp;*.ico;*.gif;*.jpg)|*.bmp;*.ico;*.gif;*.jpg"
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim fileName As String = OpenFileDialog1.FileName
            Dim bmp As Bitmap = Bitmap.FromFile(fileName)
            Dim bmp2 As New Bitmap(bmp)
            Dim c As Color
            For x As Integer = 0 To bmp.Width - 1
                For y As Integer = 0 To bmp.Height - 1
                    c = bmp.GetPixel(x, y)
                    ' analyze the color somehow...
                    If c.R < 125 And c.B < 125 Then
                        ' set a pixel in your new bitmap...
                        bmp2.SetPixel(x, y, Color.FromArgb(someRedValue, someGreenValue, someBlueValue))
                    End If
                Next
            Next
            bmp.Dispose()
            PictureBox1.Image = bmp2
            bmp2.Save("yourNewFileNameHere.bmp")
        End If
    End Sub
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 16961149
Here is a working example of converting an image to grayscale:

http://www.bobpowell.net/grayscale.htm

Bob
0
 

Author Comment

by:gorexy
ID: 16966576
Hi Ide_mind
 your code is great and simple, just a few questions:

1. what is C.B, C.R?
If i want to turn my pic into Black and White only, how to set?
2.  it can output the bmp file but invalid (cannot be opened)

Thanks
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 16969117
C.R, C.B and C.G will give you the value of the red, green and blue components of that color.

You can specify the image format when you save the file.  Something like...

    bmp2.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp)

Did you try the code in Bob's link?

Here is the formula in that link applied to my code.  It saves a greyscale image using the same filename but with a .bmp extension.  If the file was already a bmp then it is REPLACED with the greyscale version:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim OpenFileDialog1 As New OpenFileDialog
        OpenFileDialog1.Filter = "(*.bmp;*.ico;*.gif;*.jpg)|*.bmp;*.ico;*.gif;*.jpg"
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim fileName As String = OpenFileDialog1.FileName
            Dim bmp As Bitmap = Bitmap.FromFile(fileName)
            Dim bmp2 As New Bitmap(bmp)
            bmp.Dispose()

            Dim c As Color
            Dim luma As Integer
            For x As Integer = 0 To bmp2.Width - 1
                For y As Integer = 0 To bmp2.Height - 1
                    c = bmp2.GetPixel(x, y)
                    luma = CInt(c.R * 0.3 + c.G * 0.59 + c.B * 0.11)
                    bmp2.SetPixel(x, y, Color.FromArgb(luma, luma, luma))
                Next
            Next

            Dim fi As New System.IO.FileInfo(fileName)
            If fi.Extension.ToUpper <> ".BMP" Then
                fileName = fi.FullName.Substring(0, fi.Name.LastIndexOf(fi.Extension)) & ".bmp"
            End If
            bmp2.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp)
        End If
    End Sub
0
 

Author Comment

by:gorexy
ID: 16973703
finally i use the code to display B/W pic

 For x As Integer = 0 To bmp.Width - 1
                For y As Integer = 0 To bmp.Height - 1
                    c = bmp.GetPixel(x, y)
                    ' analyze the color somehow...
                    If c.R < 125 Then
                        ' set a pixel in your new bitmap...
                        bmp2.SetPixel(x, y, Color.FromArgb(0, 0, 0))
                    End If

                    If c.B >= 125 Then
                        bmp2.SetPixel(x, y, Color.FromArgb(255, 255, 255))
                    End If


                Next
            Next

Can I further operate the thresholed pic?
0
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 20 total points
ID: 16973710
I don't understand your last question there...  =\

Does the code above work as you want it to?
0
 

Author Comment

by:gorexy
ID: 16973818
yes the code works now.

as I am trying to play with barcode like reading and so I try to threhold the image into black/white and then decode them into 0101010...

do you think it works?
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article explains how to create and use a custom WaterMark textbox class.  The custom WaterMark textbox class allows you to set the WaterMark Background Color and WaterMark text at design time.   IMAGE OF WATERMARKS STEPS Create VB …
I think the Typed DataTable and Typed DataSet are very good options when working with data, but I don't like auto-generated code. First, I create an Abstract Class for my DataTables Common Code.  This class Inherits from DataTable. Also, it can …
In a recent question (https://www.experts-exchange.com/questions/29004105/Run-AutoHotkey-script-directly-from-Notepad.html) here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…

735 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question