2014-11-10 4 views
0

Я новичок в графическом программировании. У меня есть код, как показано ниже, чтобы захватить отпечаток пальца со сканера:Инвертировать цвета отпечатанного отпечатка пальца

[DllImport("gdi32.dll")] 
    static extern IntPtr CreateDIBitmap(IntPtr hdc, [In] ref BITMAPINFOHEADER lpbmih, 
             uint fdwInit, byte[] lpbInit, byte[] lpbmi, 
             uint fuUsage); 


    /* constants for CreateDIBitmap */ 
    const int CBM_INIT = 0x04; /* initialize bitmap */ 

    /* DIB color table identifiers */ 
    const int DIB_RGB_COLORS = 0; /* color table in RGBs */ 
    const int DIB_PAL_COLORS = 1; /* color table in palette indices */ 

    const int BI_RGB = 0; 

    private Bitmap CreateBitmap(IntPtr hDC, Size bmpSize, byte[] data) 
    { 
     System.IO.MemoryStream mem = new System.IO.MemoryStream(); 
     System.IO.BinaryWriter bw = new System.IO.BinaryWriter(mem); 
     //BITMAPINFO bmpInfo = new BITMAPINFO(); 
     BITMAPINFOHEADER bmiHeader = new BITMAPINFOHEADER(); 
     bmiHeader.biSize = 40; 
     bmiHeader.biWidth = bmpSize.Width; 
     bmiHeader.biHeight = bmpSize.Height; 
     bmiHeader.biPlanes = 1; 
     bmiHeader.biBitCount = 8; 
     bmiHeader.biCompression = BI_RGB; 
     bw.Write(bmiHeader.biSize); 
     bw.Write(bmiHeader.biWidth); 
     bw.Write(bmiHeader.biHeight); 
     bw.Write(bmiHeader.biPlanes); 
     bw.Write(bmiHeader.biBitCount); 
     bw.Write(bmiHeader.biCompression); 
     bw.Write(bmiHeader.biSizeImage); 
     bw.Write(bmiHeader.biXPelsPerMeter); 
     bw.Write(bmiHeader.biYPelsPerMeter); 
     bw.Write(bmiHeader.biClrUsed); 
     bw.Write(bmiHeader.biClrImportant); 

     for (int i = 0; i < 256; i++) 
     { 
      bw.Write((byte)i); 
      bw.Write((byte)i); 
      bw.Write((byte)i); 
      bw.Write((byte)0); 
     } 

     IntPtr hBitmap; 
     if (data != null) 
     { 
      hBitmap = CreateDIBitmap(hDC, ref bmiHeader, CBM_INIT, data, mem.ToArray(), DIB_RGB_COLORS); 
     } 
     else 
     { 
      hBitmap = CreateDIBitmap(hDC, ref bmiHeader, 0, null, mem.ToArray(), DIB_RGB_COLORS); 
     } 
     return Bitmap.FromHbitmap(hBitmap); 
    } 

который генерирует изображение с Black фоном и White гребней, но я хочу, чтобы инвертировать те цвета, и я хочу White фон с Black гребней.

Возможно ли это?

+0

где находятся данные? можете ли вы инвертировать значения в данных? – ShayD

+0

Да, это возможно. Это зависит от того, как вы хотите это сделать. Вы можете использовать библиотеки, вы можете перемещаться по пикселям и изменять их цвет. – Reniuz

+0

@Reniuz Какой из них эффективен? И можете ли вы привести пример того, как это можно сделать? –

ответ

1

Вот пример, который является (I thing) самым легким, но медленным. Это просто дать вам представление о том, как это можно сделать. Примечание RGB(255,255,255) белый и RGB(0,0,0) черный цвет. Идея проста, если у вас есть пиксель черный, поэтому от 255 вычитания каждого цвета вы получите белый. И наоборот 255 - 0 = 255.

public Bitmap InvertBitmapColor(Bitmap img) 
{ 
    Bitmap result = new Bitmap(img); 
    Color currentColor, newColor; 
    for(int x=0; x < img.Width; x++) 
    for(int y=0; y < img.Height; y++) 
    { 
     currentColor = img.GetPixel(x, y); 
     newColor = Color.FromArgb(255 - currentColor.R, 255 - currentColor.G, 255 - currentColor.B); 
     result.SetPixel(x, y, newColor); 
    } 
    return result; 
} 

Если вам нужно использовать быструю обработку изображения LockBits. Вы можете найти пример как here