문제

나는 알 수 없는 더 나은 제목 그러나 나는 설명하는 문제입니다.

하드웨어 우리가 사용하는 능력이 있는 이미지를 표시합니다.그것을 표시할 수 있는 흑백 이미지 해상도와의 64x256 입니다.

문제는 이미지의 형식이 우리가 보내는 장치입니다.그것은 표준 bitmap 형식이지만,대신 그것은 간단하게 배열의 바이트 수를 나타내는 각 픽셀의 이미지입니다.

0=흑색,1=흰색이다.

그렇다면 우리는 이미지 크기:4x4 바이트 배열은 다음과 같습니다:

1000 0100 0010 0001

이미지 다음과 같을 것이다:

비트맵 http://www.mediafire.com/imgbnc.php/6ee6a28148d0170708cb10ec7ce6512e4g.jpg

문제는 우리가 만들 필요가 이미지를 만들어 흑백 비트맵 C#다음 그것을 변환하는 파일 형식을 이해하는 장치입니다.

예를 들어,하나의 수도에서 텍스트를 표시하는 장치입니다.그렇게하기 위해서는 그는 것입 을 만들어야트맵 텍스트를 쓰:

var bitmap = new Bitmap(256, 64);

using (var graphics = Graphics.FromImage(bitmap))
{
    graphics.DrawString("Hello World", new Font("Courier", 10, FontStyle.Regular), new SolidBrush(Color.White), 1, 1);
}

거기에는 2 개의 문제 여기:

  1. 생성된 비트맵지 않 흑백
  2. 생성된 비트맵은 다른 바이너리 형식

그래서 나는 방법이 필요하다:

  1. 성의 흑백 비트맵습니다.NET
  2. 읽기의 개별 픽셀의 색상에서 각 픽셀트맵

내가 찾는 설정할 수 있습니다 pixel depth16,24,또는 32 비트이지만,없 흑백고 나는 아이디어가 있지 않을 읽는 방법을 픽셀 데이터입니다.

제안을 환영합니다.

업데이트: 나는 사용할 수 없습니다 Win32PInvokes...는 플랫폼 중성!

따라: 다음 코드를 사용해야 합니다 나를 위해 지금입니다.(경우에 사람이 그것을 필요)

private static byte[] GetLedBytes(Bitmap bitmap)
{
    int threshold = 127;
    int index = 0;
    int dimensions = bitmap.Height * bitmap.Width;

    BitArray bits = new BitArray(dimensions);

    //Vertically
    for (int y = 0; y < bitmap.Height; y++)
    {
        //Horizontally
        for (int x = 0; x < bitmap.Width; x++)
        {
            Color c = bitmap.GetPixel(x, y);
            int luminance = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
            bits[index] = (luminance > threshold);
            index++;
        }
    }

    byte[] data = new byte[dimensions / 8];
    bits.CopyTo(data, 0);
    return data;
}
도움이 되었습니까?

해결책

각 픽셀 A의 휘도를 계산 한 다음 임계 값과 비교합니다.

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

임계 값이 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;
  }
}

다른 팁

모르겠습니다.있는 가능성이 많은가지 방법이 있다.여기에는 간단한 방법입니다.

  1. 을 만들이 빈 블랙 비트맵 이미지의 크기는 같은 장치 요구 사항입니다.에 그리고 당신이 무엇을 원을 그리처럼 텍스트,그림,등등.

  2. 지금 임계값의 이미지,즉트는 픽셀 이미지의 아래에 있는 강렬한 가치로 다른 설정합니다.예:모든 설정 값>0 1 입니다.

  3. 지금 변환하여 필요한 형식의 장치입니다.만들기를 바이트 배열의 크기(64*256)/8 입니다.설정의 상응하는 비트가하여 1 곳의 해당 픽셀값에서 이전에 비트맵은 1,다른 사람 다시 설정하 0.

편집:단계 3.사용 비트 연산자를 설정하는 비트입니다.

를 사용해서는 안 됩 GetPixel 방법을 비트맵로 변환하 전체에서 비트맵 다른 한 형식!이의 효율성이 저하됩니다.대신 사용해야 합니다 LockBits 하는 방법에 대한 액세스를 얻을 복사본 이미지 버퍼 변환로 원하는 형식입니다.나는에 대해 완전히 확실하지 않으로 변환하 흑백만 아 Format1bppIndexed 값에 PixelFormat 열거는 당신을 도움이 될 수 있습니다.

생성자에 pixelforMat을 공급하려고 시도 할 수 있습니다.

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

다른 플랫폼에 단색 비트 맵을 그렸을 때 때때로 항아리아를 비활성화해야했거나 렌더링 된 텍스트가 표시되지 않습니다.

graphics.SmoothingMode=SmoothingMode.None;

ymmv.

비트맵 GetPixel 방법 당신이 사용할 수 있습니다.이것은 당신에 그리는 비트맵 이후로 변환하는 형식으로 필요합니다.

비트맵에서는 윈도우 폼(ie,액세스를 통해 그래픽입니다.FromImage)24bpp(아마 32?그것은 너무 일찍 나는 정직하지 않음).그럼에도 불구하고,GetPixel 반환하는 컬러,그들의 비트 비트맵은 무형입니다.나는 당신의 코드를 작성하고 다음과 같다:

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);
}

이 과정은 단순한 임계값.그것은 참조:그러나 그것으로 작동 첫 번째 절단한다.

위의 코드에 감사드립니다 - 흑백 이미지를 1- 블랙 0- 흰색이지만 문제가있는 2D 배열로 변환하려고합니다. 코드를 사용하여 8x8 BMP 이미지를로드하고 내용을 출력합니다. 사용하여 텍스트 상자에

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

그러나 텍스트 상자에서 결과로 이것을 얻습니다.

225  231  231  231  231  129  255  

0과 1이므로 어떻게 얻습니까?

이 챕터 모노 비트 맵을 만드는 코드가 있습니다. SaveImage 샘플은 관심있는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top