C # - заполнение байтов изображения белыми байтами для заполнения 512 x 512 - PullRequest
0 голосов
/ 07 мая 2019

Я использую Digital Persona SDK для сканирования отпечатков пальцев в формате wsq, для этого мне нужно изображение 512 x 512, SDK экспортирует только 357 x 392 изображения.

SDK предоставляет метод для сжатия захваченного изображения с устройства в формате wsq и возврата байтового массива, который я могу записать на диск.

- Я попытался выделить буфер 262144 для изображения 512 x 512.

-Заполнить новый буфер белыми пиксельными данными каждый байт до значения 255.

-Скопируйте исходный буфер изображения в новый буфер изображения. Исходное изображение не нужно центрировать, но важно обязательно копировать, не повреждая данные изображения.

Подводя итог, я попытался скопировать старое изображение в верхний правый угол нового изображения.

DPUruNet.Compression.Start();
DPUruNet.Compression.SetWsqBitrate(95, 0);

Fid capturedImage = captureResult.Data;

//Fill the new buffer with white pixel data each byte to value 255.
byte[] bytesWSQ512 = new byte[262144];
for (int i = 0; i < bytesWSQ512.Length; i++)
{
    bytesWSQ512[i] = 255;
}

//Compress capturedImage and get bytes (357 x 392)
byte[] bytesWSQ = DPUruNet.Compression.CompressRaw(capturedImage.Views[0].Width, capturedImage.Views[0].Height, 500, 8, capturedImage.Views[0].RawImage, CompressionAlgorithm.COMPRESSION_WSQ_NIST);

//Copy the original image buffer into the new image buffer
for (int i = 0; i < capturedImage.Views[0].Height; i++)
{
    for (int j = 0; j < capturedImage.Views[0].Width; j++)
    {
        bytesWSQ512[i * bytesWSQ512.Length + j ] = bytesWSQ[i * capturedImage.Views[0].Width + j];
    }
}
//Write bytes to disk
File.WriteAllBytes(@"C:\Users\Admin\Desktop\bytesWSQ512.wsq", bytesWSQ512);
DPUruNet.Compression.Finish();

При выполнении этого фрагмента я получаю IndexOutOfRangeException, я не знаю, правильный ли цикл или вычисление индексов для нового массива.

Вот представление о том, что я пытаюсь сделать.

image

1 Ответ

0 голосов
/ 19 июня 2019

Если кто-то пытается добиться чего-то подобного или дополнить необработанное изображение, я надеюсь, что это поможет.

DPUruNet.Compression.
DPUruNet.Compression.SetWsqBitrate(75, 0);
Fid ISOFid = captureResult.Data;

byte[] paddedImage = PadImage8BPP(captureResult.Data.Views[0].RawImage, captureResult.Data.Views[0].Width, captureResult.Data.Views[0].Height, 512, 512, 255);
byte[] bytesWSQ512 = Compression.CompressRaw(512, 512, 500, 8, paddedImage, CompressionAlgorithm.COMPRESSION_WSQ_NIST);

И метод изменения размера (заполнения) изображения:

public byte[] PadImage8BPP(byte[] original, int original_width, int original_height, int desired_width, int desired_height, byte pad_color)
    {
        byte[] canvas_8bpp = new byte[desired_width * desired_height];

        for (int i = 0; i < canvas_8bpp.Length; i++)
            canvas_8bpp[i] = pad_color; //Fill background.  Note this type of fill will fail histogram checks.

        int clamp_y_begin = 0;
        int clamp_y_end = original_height;
        int clamp_x_begin = 0;
        int clamp_x_end = original_width;

        int pad_y = 0;
        int pad_x = 0;

        if (original_height > desired_height)
        {
            int crop_distance = (int)Math.Ceiling((original_height - desired_height) / 2.0);
            clamp_y_begin = crop_distance;
            clamp_y_end = original_height - crop_distance;
        }
        else
        {
            pad_y = (desired_height - original_height) / 2;
        }

        if (original_width > desired_width)
        {
            int crop_distance = (int)Math.Ceiling((original_width - desired_width) / 2.0);
            clamp_x_begin = crop_distance;
            clamp_x_end = original_width - crop_distance;
        }
        else
        {
            pad_x = (desired_width - original_width) / 2;
        }

        //We traverse the captured image (either whole image or subset)
        for (int y = clamp_y_begin; y < clamp_y_end; y++)
        {
            for (int x = clamp_x_begin; x < clamp_x_end; x++)
            {
                byte image_pixel = original[y * original_width + x];
                canvas_8bpp[(pad_y + y - clamp_y_begin) * desired_width + pad_x + x - clamp_x_begin] = image_pixel;
            }
        }

        return canvas_8bpp;
    }
...