title: Convert BMP image to GRF format C# / VB.NET (To use in ZPL printer)
body: <p>I am using following code to convert BMP Image to GRF format. </p>
  
  <pre><code>Public Shared Function CreateGrf(filename As String, imagename As String) As String
      Dim bmp As Bitmap = Nothing
      Dim imgData As BitmapData = Nothing
      Dim pixels As Byte()
      Dim x As Integer, y As Integer, width As Integer
      Dim sb As StringBuilder
      Dim ptr As IntPtr
  
      Try
          bmp = New Bitmap(filename)
          imgData = bmp.LockBits(New System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat)
          width = (bmp.Width + 7) \ 8
          pixels = New Byte(width - 1) {}
          sb = New StringBuilder(width * bmp.Height * 2)
          sb.Append(Environment.NewLine)
          ptr = imgData.Scan0
  
          For y = 0 To bmp.Height - 1
              Marshal.Copy(ptr, pixels, 0, width)
              For x = 0 To width - 1
                  sb.AppendFormat("{0:X2}", CByte(Not pixels(x)))
              Next
              sb.Append(Environment.NewLine)
              ptr = ptr.ToInt64() + imgData.Stride
          Next
      Finally
          If bmp IsNot Nothing Then
              If imgData IsNot Nothing Then
                  bmp.UnlockBits(imgData)
              End If
              bmp.Dispose()
          End If
      End Try
      Return [String].Format("~DG{0},{1},{2},", imagename, width * y, width) + sb.ToString()
  End Function
  </code></pre>
  
  <p>However there is an extra vertical line drawn at the end of the converted GRF file even though there is no such line in the BMP file. Other than that the size and everything is Ok. It seems the last pixel (hex value) of each row is not correct in the GRF file. </p>
  
  <p><img src="https://i.stack.imgur.com/LJbV6.png" alt="Original BMP Image"></p>
  
  <p>Original BMP File.</p>
  
  <p><img src="https://i.stack.imgur.com/4FP1H.jpg" alt="Converted GRF FIle"></p>
  
  <p>Converted GRF FIle</p>