【问题标题】:Invert the colors of Captured finger print反转捕获的指纹的颜色
【发布时间】:2015-01-06 19:17:27
【问题描述】:

我是图形编程的新手。我有如下代码来从扫描仪中捕获指纹:

    [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 脊。

有可能吗?

【问题讨论】:

  • 数据从何而来?你可以反转数据中的值吗?
  • 是的,这是可能的。这取决于你想怎么做。您可以使用库,可以循环遍历像素并更改其颜色。
  • @Reniuz 哪个效率高?你能举个例子说明如何做到吗?

标签: c# bitmap gdi fingerprint


【解决方案1】:

这是一个(我认为)最简单但速度很慢的示例。这只是为了让您了解如何完成。注意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的例子

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 2011-06-08
    • 2018-12-05
    • 2013-07-24
    • 1970-01-01
    • 2013-12-24
    • 2012-11-27
    • 2018-04-16
    相关资源
    最近更新 更多