Проблема с Magic.Net ToByteArray() (при использовании с ZBarSharp)

С ZBar-Sharp (https://github.com/jonasfj/zbar-sharp) изображение было обработано системной библиотекой в ​​классе Image с кодом ниже

===============

public Image(System.Drawing.Image image) : this() {

    Byte[] data = new byte[image.Width * image.Height * 3];
    //Convert the image to RBG3
    using(Bitmap bitmap = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb)){
        using(Graphics g = Graphics.FromImage(bitmap)){
            g.PageUnit = GraphicsUnit.Pixel;
            g.DrawImageUnscaled(image, 0, 0);
        }
        // Vertically flip image as we are about to store it as BMP on a memory stream below
        // This way we don't need to worry about BMP being upside-down when copying to byte array
        bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
        using(MemoryStream ms = new MemoryStream()){
        bitmap.Save(ms, ImageFormat.Bmp);
        ms.Seek(54, SeekOrigin.Begin);
        ms.Read(data, 0, data.Length);
        }
    }
    //Set the data
    this.Data = data;
    this.Width = (uint)image.Width;
    this.Height = (uint)image.Height;
    this.Format = FourCC('R', 'G', 'B', '3');
}

===============

А позже преобразовал в Y800 изнутри Zbar.

Однако при таком подходе точность сканирования была скомпрометирована, когда я сравниваю собственное сканирование ZBar с правильностью 99,x%, в то время как у оболочки .Net было только 80%.

Поскольку ZBar изначально использует магию изображений для задач обработки изображений, было предложено использовать imageMagic.Net для обработки изображений и передачи их в Zbar DLL, а не использовать библиотеку .Net.

Поэтому я подумал, что класс Image внутри ZBarSharp должен быть обновлен с помощью перегрузки, как показано ниже.

=================

public Image(string fileName)
: this()
{
MagickImage image = new MagickImage(fileName, settings);

//Set the data
this.Data = image.ToByteArray();
this.Width = (uint)image.Width;
this.Height = (uint)image.Height;
this.Format = FourCC('R', 'G', 'B', '3');
}

=================

Однако я понял, что в то время как исходная библиотека .Net создает изображения Byte[] длиной около 5650614 и смещением 54, чтобы получить 5650560 в одном конкретном файле, imageMagic читает тот же файл и генерирует Byte[] длиной 15194, что значительно меньше, а также Byte[] из imageMagic.Net всегда не получают результата от сканирования. Я пробовал много разных настроек для imageMagic Read по плотности, формату и т. Д., Но длина массива всегда была короткой, и я не получил результата от сканирования.

Просто интересно, может ли кто-нибудь помочь мне указать, что я пропустил, чтобы использовать imageMagic.Net для аналогичного эквивалента, созданного библиотекой .Net, но лучшего качества?

Спасибо в рекламе.


person NiceCall    schedule 13.10.2013    source источник
comment
Что это за волшебное число 54?   -  person spender    schedule 14.10.2013
comment
Мне кажется, что вам было бы намного лучше использовать одно из решений, опубликованных на этот вопрос, чтобы получить массив RGB3/RGB24: stackoverflow.com/questions/4747428/ вместо того, чтобы копаться в темный. Учитывая, что вы используете необработанные данные RGB из немасштабированного изображения, я не ожидаю, что замена на ImageMagick будет правильным подходом. .Net может сделать это вполне успешно, не вызывая IM.   -  person spender    schedule 14.10.2013
comment
Я получил ошибку + System.IntPrt с int при использовании ответа оттуда. Попробую копнуть дальше. Понятия не имею про магические 54, но ширина * высота * 3 была ровно на 54 меньше, чем длина memorystream из кода. Магия 54.   -  person NiceCall    schedule 14.10.2013
comment
Что вы пытаетесь достичь? Метод ToByteArray просто записывает одно и то же изображение в массив байтов. Когда вы пытаетесь получить отдельные пиксели, вы можете использовать метод GetReadOnlyPixels. Не стесняйтесь начинать новое обсуждение здесь: magick.codeplex.com/discussions.   -  person dlemstra    schedule 15.10.2013