Създайте 1bpp маска от изображение

Как се създава маска от 1 бит на пиксел от изображение с помощта на GDI в C#? Изображението, от което се опитвам да създам маската, се съхранява в обект System.Drawing.Graphics.

Виждал съм примери, които използват Get/SetPixel в цикъл, които са твърде бавни. Методът, който ме интересува, е този, който използва само BitBlits, като този. Просто не мога да го накарам да работи в C#, всяка помощ е много ценена.


person Matt Borum    schedule 07.11.2008    source източник


Отговори (3)


Опитайте тази:

using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

...

   public static Bitmap BitmapTo1Bpp(Bitmap img) {
      int w = img.Width;
      int h = img.Height;
      Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed);
      BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
      for (int y = 0; y < h; y++) {
        byte[] scan = new byte[(w + 7) / 8];
        for (int x = 0; x < w; x++) {
          Color c = img.GetPixel(x, y);
          if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8));
        }
        Marshal.Copy(scan, 0, (IntPtr)((int)data.Scan0 + data.Stride * y), scan.Length);
      }
      bmp.UnlockBits(data);
      return bmp;
    }

GetPixel() е бавен, можете да го ускорите с опасен байт*.

person Hans Passant    schedule 07.11.2008
comment
Благодаря ти nobugz! Редактирах оригиналния въпрос, тъй като се опитвах да избегна цикъла Get/SetPixel. Моите извинения. - person Matt Borum; 09.11.2008

В Win32 C API процесът за създаване на моно маска е прост.

  • Създайте неинициализирано растерно изображение от 1 bpp, толкова голямо, колкото изходното растерно изображение.
  • Изберете го в DC.
  • Изберете изходното растерно изображение в DC.
  • SetBkColor на целевия DC, за да съответства на цвета на маската на изходното растерно изображение.
  • BitBlt източника към местоназначението с помощта на SRC_COPY.

За бонус точки тогава обикновено е желателно маската да се изчертае обратно върху изходното растерно изображение (използвайки SRC_AND), за да нулира цвета на маската там.

person Chris Becke    schedule 15.03.2009

Имате предвид LockBits? Боб Пауъл има общ преглед на LockBits тук ; това трябва да осигури достъп до RGB стойностите, за да направите това, от което се нуждаете. Може също да искате да погледнете ColorMatrix, така.

person Marc Gravell    schedule 09.11.2008