Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 697215
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 14, 20262026-05-14T03:08:42+00:00 2026-05-14T03:08:42+00:00

So here’s my issue. I have an image that I need to shrink. The

  • 0

So here’s my issue. I have an image that I need to shrink. The original image is a grayscale PNG, which isn’t a huge issues except that when I shrink it down, the thermal label printers pickup the artifacts and print them on the label. So, what I did was change the image to black & white (Format1bppIndexed) before resizing, like this:

Dim bte() As Byte = System.Convert.FromBase64String(imgStr)
Dim ms As New IO.MemoryStream(bte)
Dim bmp As New System.Drawing.Bitmap(ms)
Dim monoImage As Drawing.Bitmap = New Drawing.Bitmap(1200, 1800, Drawing.Imaging.PixelFormat.Format1bppIndexed)
Dim rect As New Drawing.Rectangle(0, 0, 1200, 1800)
monoImage = bmp.Clone(rect, Drawing.Imaging.PixelFormat.Format1bppIndexed)

And then I resize it. This code works fine on my Windows 7 machine, but when I run it on the Windows 2003 Server box that it calls home, it always throws an OutOfMemoryException when it hits the bmp.Clone line.

Any ideas as to what’s happening, or perhaps a better solution to converting the image to B&W?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-14T03:08:42+00:00Added an answer on May 14, 2026 at 3:08 am

    Here’s some converted source code from this article:

    Option Explicit On
    Option Strict On
    
    Public Class BitmapEncoder
        ''' <summary>
        ''' Copies a bitmap into a 1bpp bitmap of the same dimensions, fast
        ''' </summary>
        ''' <param name="b">original bitmap</param>
        ''' <returns>a 1bpp copy of the bitmap</returns>
        Public Shared Function ConvertBitmapTo1bpp(ByVal b As System.Drawing.Bitmap) As System.Drawing.Bitmap
            ' Plan: built into Windows GDI is the ability to convert
            ' bitmaps from one format to another. Most of the time, this
            ' job is actually done by the graphics hardware accelerator card
            ' and so is extremely fast. The rest of the time, the job is done by
            ' very fast native code.
            ' We will call into this GDI functionality from C#. Our plan:
            ' (1) Convert our Bitmap into a GDI hbitmap (ie. copy unmanaged->managed)
            ' (2) Create a GDI monochrome hbitmap
            ' (3) Use GDI "BitBlt" function to copy from hbitmap into monochrome (as above)
            ' (4) Convert the monochrone hbitmap into a Bitmap (ie. copy unmanaged->managed)
    
            Dim w As Integer = b.Width, h As Integer = b.Height
            Dim hbm As IntPtr = b.GetHbitmap()
            ' this is step (1)
            '
            ' Step (2): create the monochrome bitmap.
            ' "BITMAPINFO" is an interop-struct which we define below.
            ' In GDI terms, it's a BITMAPHEADERINFO followed by an array of two RGBQUADs
            Dim bmi As New BITMAPINFO()
            bmi.biSize = 40
            ' the size of the BITMAPHEADERINFO struct
            bmi.biWidth = w
            bmi.biHeight = h
            bmi.biPlanes = 1
            ' "planes" are confusing. We always use just 1. Read MSDN for more info.
            bmi.biBitCount = CShort(1)
            ' ie. 1bpp or 8bpp
            bmi.biCompression = BI_RGB
            ' ie. the pixels in our RGBQUAD table are stored as RGBs, not palette indexes
            bmi.biSizeImage = CUInt((((w + 7) And &HFFFFFFF8) * h / 8))
            bmi.biXPelsPerMeter = 1000000
            ' not really important
            bmi.biYPelsPerMeter = 1000000
            ' not really important
            ' Now for the colour table.
            Dim ncols As UInteger = CUInt(1) << 1
            ' 2 colours for 1bpp; 256 colours for 8bpp
            bmi.biClrUsed = ncols
            bmi.biClrImportant = ncols
            bmi.cols = New UInteger(255) {}
            ' The structure always has fixed size 256, even if we end up using fewer colours
    
            bmi.cols(0) = MAKERGB(0, 0, 0)
            bmi.cols(1) = MAKERGB(255, 255, 255)
            ' 
            ' Now create the indexed bitmap "hbm0"
            Dim bits0 As IntPtr
            ' not used for our purposes. It returns a pointer to the raw bits that make up the bitmap.
            Dim hbm0 As IntPtr = CreateDIBSection(IntPtr.Zero, bmi, DIB_RGB_COLORS, bits0, IntPtr.Zero, 0)
            '
            ' Step (3): use GDI's BitBlt function to copy from original hbitmap into monocrhome bitmap
            ' GDI programming is kind of confusing... nb. The GDI equivalent of "Graphics" is called a "DC".
            Dim sdc As IntPtr = GetDC(IntPtr.Zero)
            ' First we obtain the DC for the screen
            ' Next, create a DC for the original hbitmap
            Dim hdc As IntPtr = CreateCompatibleDC(sdc)
            SelectObject(hdc, hbm)
            ' and create a DC for the monochrome hbitmap
            Dim hdc0 As IntPtr = CreateCompatibleDC(sdc)
            SelectObject(hdc0, hbm0)
            ' Now we can do the BitBlt:
            BitBlt(hdc0, 0, 0, w, h, hdc, 0, 0, SRCCOPY)
            ' Step (4): convert this monochrome hbitmap back into a Bitmap:
            Dim b0 As System.Drawing.Bitmap = System.Drawing.Bitmap.FromHbitmap(hbm0)
            '
            ' Finally some cleanup.
            DeleteDC(hdc)
            DeleteDC(hdc0)
            ReleaseDC(IntPtr.Zero, sdc)
            DeleteObject(hbm)
            DeleteObject(hbm0)
            '
            Return b0
        End Function
    
    
        Private Shared SRCCOPY As Integer = &HCC0020
        Private Shared BI_RGB As UInteger = 0
        Private Shared DIB_RGB_COLORS As UInteger = 0
        <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
        Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
        End Function
    
        <System.Runtime.InteropServices.DllImport("user32.dll")> _
        Private Shared Function GetDC(ByVal hwnd As IntPtr) As IntPtr
        End Function
    
        <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
        Private Shared Function CreateCompatibleDC(ByVal hdc As IntPtr) As IntPtr
        End Function
    
        <System.Runtime.InteropServices.DllImport("user32.dll")> _
        Private Shared Function ReleaseDC(ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Integer
        End Function
    
        <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
        Private Shared Function DeleteDC(ByVal hdc As IntPtr) As Integer
        End Function
    
        <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
        Private Shared Function SelectObject(ByVal hdc As IntPtr, ByVal hgdiobj As IntPtr) As IntPtr
        End Function
    
        <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
        Private Shared Function BitBlt(ByVal hdcDst As IntPtr, ByVal xDst As Integer, ByVal yDst As Integer, ByVal w As Integer, ByVal h As Integer, ByVal hdcSrc As IntPtr, _
         ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal rop As Integer) As Integer
        End Function
    
    
        <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
        Private Shared Function CreateDIBSection(ByVal hdc As IntPtr, ByRef bmi As BITMAPINFO, ByVal Usage As UInteger, ByRef bits As IntPtr, ByVal hSection As IntPtr, ByVal dwOffset As UInteger) As IntPtr
        End Function
    
        <System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)> _
        Private Structure BITMAPINFO
            Public biSize As UInteger
            Public biWidth As Integer, biHeight As Integer
            Public biPlanes As Short, biBitCount As Short
            Public biCompression As UInteger, biSizeImage As UInteger
            Public biXPelsPerMeter As Integer, biYPelsPerMeter As Integer
            Public biClrUsed As UInteger, biClrImportant As UInteger
            <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=256)> _
            Public cols As UInteger()
        End Structure
    
        Private Shared Function MAKERGB(ByVal r As Integer, ByVal g As Integer, ByVal b As Integer) As UInteger
            Return CUInt((b And 255)) Or CUInt(((r And 255) << 8)) Or CUInt(((g And 255) << 16))
        End Function
        Private Sub New()
    
        End Sub
    End Class
    

    Call it using:

        Dim myFile = "c:\test.jpg"
    
        Using Input As New Bitmap(myFile)
            Using Output = BitmapEncoder.ConvertBitmapTo1bpp(Input)
                Output.Save("c:\test.bmp")
            End Using
        End Using
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Here's the setup - I have a view that lists products. On that same
Here is a scenario: User installs .NET application that you have made. After some
Here is my scenario. I have a website running under AppPool1 and that works
Here are the tables I have: Table A which has entries with item and
Here's the code I have. It works. The only problem is that the first
Here's the scenario: I have a local git repository that mirrors the contents of
Here's the problem....I have three components...A Page that contains a User Control and a
Here's the situation, i want to have a user that can enter time on
Here is the scenario: I have several CIFS partitions which AD-based users can mount
Here's the view: @if (stream.StreamSourceId == 1) { <img class=source src=@Url.Content(~/Public/assets/images/own3dlogo.png) alt= /> }

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.