views:

2904

answers:

7
+1  A: 

This chap has some code that creates a mono bitmap. The SaveImage sample is the one of interest.

Quibblesome
+1  A: 

I don't know C#. There are possibly many ways to do it. Here is a simple way.

  1. Create a blank black bitmap image of size equal to your device requirement. Draw on it whatever you wish to draw like text, figures etc.

  2. Now threshold the image i.e. set the pixel of image below an intensity value to zero else set it to. e.g. set all intensity values > 0 to 1.

  3. Now convert to the format required by your device. Create a byte array of the size (64 * 256)/8. Set the corresponding bits to 1 where the corresponding pixel values in earlier bitmap are 1, else reset them to 0.

Edit: Step 3. Use bitwise operators to set the bits.

Xolve
The problem is I have no idea how to read pixel values of a bitmap
TimothyP
Well you need to check to the APIs. There must be some method like getPixel(), getIntensity() or maybe even a simple array reference will do.
Xolve
+4  A: 

I'd compute the luminance of each pixel a then compare it to some threshold value.

y=0.3*R+0.59G*G+0.11*B

Say the threshold value is 127:

const int threshold = 127;
Bitmap bm = { some source bitmap };

byte[,] buffer = new byte[64,256];

for(int y=0;y<bm.Height;y++)
{
  for(int x=0;x<bm.Width;x++)
  {
   Color c=source.GetPixel(x,y);
   int luminance = (int)(c.R*0.3 + c.G*0.59+ c.B*0.11);
   buffer[x,y] = (luminance  > 127) ? 1 : 0;
  }
}
arul
Point for that! But if you use Bitmap.LockBits instead of Bitmap.GetPixel you get superior performance!
danbystrom
Thnx!With a few minor adjustments this code works like a charm :-)
TimothyP
danbystrom: You're right, wanted to keep the sample code as clean and pointer-less as possible.
arul
+1  A: 

You shouldn't use GetPixel method of your bitmap to convert entire bitmap from one format to another! This will be ineffective. Instead you should use LockBits method to get access to a copy of image buffer and convert it into desired format. I'm not completely sure about converting it to monochrome but there is Format1bppIndexed value in PixelFormat enumeration which may help you.

Dmitriy Matveev
+1  A: 

You may try to supply a pixelformat in the constructor:

var bitmap = new Bitmap(256, 64, PixelFormat.Format1bppIndexed);

When I did draw monochrome bitmaps on other platforms I sometimes had to disable antialiasing or the rendered text would not show up:

graphics.SmoothingMode=SmoothingMode.None;

YMMV.

You can't call Graphics.FromImage on anything less than 32bpp
plinth
+1  A: 

Bitmap has a GetPixel method that you can use. This will let you draw on the Bitmap and later convert it to the format that you need.

Bitmaps in Windows forms (ie, accessed through Graphics.FromImage) are 24 bpp (maybe 32? It's too early and I honestly forget). Nonetheless, GetPixel returns a Color object, so the bit depth of the bitmap is immaterial. I suggest you write your code like this:

MyBitmapFormat ToMyBitmap(Bitmap b)
{
    MyBitmapFormat mine = new MyBitmapFormat(b.Width, b.Height);

    for (int y=0; y < b.Height; y++) {
        for (int x=0; x < b.Width; x++) {
            mine.SetPixel(x, y, ColorIsBlackish(b.GetPixel(x, y)));
        }
    }
}

bool ColorIsBlackish(Color c)
{
    return Luminance(c) < 128; // 128 is midline
}

int Luminance(c)
{
    return (int)(0.299 * Color.Red + 0.587 * Color.Green + 0.114 * Color.Blue);
}

This process is called simple thresholding. It's braindead, but it will work as a first cut.

plinth
A: 

hi! thanks for the above code - I'm trying to convert a monochrome image into a 2d array where 1-black 0-white however I'm having some trouble - I used your code to load an 8x8 bmp image, and am outputting its contents to a textbox by using

myGrid =GetLedBytes(myBmp);
     for (int x = 1; x < 8; x++)
     {
         textBox1.Text = textBox1.Text + Convert.ToString(myGrid[x])+ "  ";
     }

however I get this as a result in the textbox:

225  231  231  231  231  129  255  

how do I get it so it's 0's and 1's?

If you use pixel.GetColor you can get the R G B values from a pixel right? So since you are doing black and white all you need to do is check R G an B == 0 which means black. All the other code is not needed.
TimothyP