3

我正在使用NITGEN 的 Finkey Hamster DX来捕捉指纹。

我已将指纹数据转换为文本格式,该格式为我提供如下字符串(以下代码中的字符串“sr”给出了此字符串):

AQAAABQAAAAEAQAAAQASAAEAZAAAAAAA*AAAAOHbWlAewfLK7kOnScKzeN5HMVcDmjce0KPkeqyeiWEdTnJutHvnhyrnkW9OPbQNQc7/94lnozdd3Zz8RKiRSj8HHdCMZ8XIdaCy0tCxp2wLwRbVrHl14QkJlQMGqeJyzu06h/ZorwN5vVoxuzFDM9dKyqlm85XHuOeoeACxO/xZrE3NdH4aesbYWgy2i5Cru2AHymemLVeu7BX5BRgFkRrx6JzcZpW9Jn0r3GOkdSqGZG85soUxNX4GN*4gJlqjfCg81cDZAi5NqiEosZjJUXwZ2677ll3OCOUaS31/7v7qF9NN1XdlNc1hrI8kQfmtbRNM3EOybwAoFTHG76rqRos

我尝试使用以下代码将此字符串转换为byte[]数组:

textFIR = new NBioAPI.Type.FIR_TEXTENCODE();
UInt32 r = m_NBioAPI.GetTextFIRFromHandle(hCapturedFIR, out textFIR, true);

string sr = "";
if (textFIR != null)
{
    sr = textFIR.TextFIR;
    byte[] src = new byte[sr.Length*sizeof(char)];

    System.Buffer.BlockCopy(sr.ToCharArray(),0,src,0,src.Length);
    MemoryStream ms = new MemoryStream(src);
    System.Drawing.Image FP = System.Drawing.Image.FromStream(ms);
    FP.Save("G:\\TempFP.Jpeg", ImageFormat.Jpeg);
}

但是Image.FromStream(ms)我得到“参数无效”。例外。

4

4 回答 4

1

尽管我对您使用的特定库没有经验,但我可以看到您的代码存在一些明显的问题,并期望它们会导致问题。检查代码的这两行:

string sr = "";
byte[] src = new byte[sr.Length*sizeof(char)];

sr此时是一个空字符串,因此 sr.Length 将为零,字节数组也将为零长度,因此BlockCopy无法向其写入任何内容。您应该将第二行移到if块内,在行之后sr = textFIR.TextFIR;

于 2013-09-07T04:57:04.267 回答
1

member 中的文本TextFIR既不是有效的 base64 编码数据,也不是图像数据。它是一个多字节的文本数据,用于存储和与其他 FIR 进行验证。

使用 NImgConv.dll 中的 API 从 FIR 数据中获取图像。

于 2013-09-07T06:13:36.283 回答
0

您应该尝试FromBase64string方法将其转换为字节数组。

public static  byte[] StringToBytes(string streamString)
{
   return Convert.FromBase64String(streamString);
}

为了确保您的 base64string 有效,您可以像这样检查它

<img alt="" src="data:image/jpeg;base64,**your base 64 string**" />

查看链接了解更多信息。

于 2013-09-07T05:31:40.737 回答
0

我认为您得到的字符串是 Base64 格式,因此您可以使用此函数将字符串转换为 Bytes[],然后使用另一个函数将 Bytes[] 转换为图像。

    internal bool SaveBytesToFile(string fileFullPath, byte[] stream)
    {
        if (stream.Length == 0) return false;
        try
        { 
            try
            {
                using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length))
                {
                    fileStream.Write(stream, 0, stream.Length);
                }
            }
            catch (Exception ex)
            {
                //Write Error log
                errorhandler.Write(ex);
                return false;
            }

            return true;
        }
        catch (Exception ex)
        {
            //Write Error log
            errorhandler.Write(ex);
            return false;
        }

    }

    internal byte[] StringToBytes(string streamString)
    {
        return Convert.FromBase64String(streamString);
    }

    internal string BytesToString(byte[] stream)
    {
        return Convert.ToBase64String(stream);
    }
于 2013-09-07T05:58:14.817 回答