This project has moved. For the latest updates, please go here.

Баг при сохранении ЧБ скана в ppm

Nov 16, 2015 at 11:50 AM
Edited Nov 16, 2015 at 1:13 PM
Добрый день!
При сканировании использую MemXferEvent (по примеру из описания), если картинка проходит по условию
_twain32_MemXferEvent
...
                        switch (e.ImageInfo.BitsPerPixel)
                        {
                            case 1:
...
то в итоге получается приблизительно следующий скан:
Image

Похоже, что расчет позиции пикселей выполняется неправильно:
                                for (int _mask = 1; (_mask & 0xff) != 0 && j < e.ImageMemXfer.Columns; _mask <<= 1, j++)
                                {
                                    _stream.WriteByte((e.ImageMemXfer.ImageData[_rowOffset + _colOffset] & _mask) != 0 ? byte.MaxValue : byte.MinValue);
                                }
                                _colOffset++;
                                j--;
                                break;
Сканер, является частью мфу, поэтому наотрез отказывается работать по другим механизмам, кроме как через память.
Буду рад любому совету!
Coordinator
Nov 16, 2015 at 6:38 PM
Добрый день, teges.
Ну насчет других механизмов:

Modes Available for Data Transfer

Native

Every Source must support this transfer mode. It is the default mode and is the easiest for an application to implement. However, it is restrictive (i.e. limited to the DIB, PICT, or TIFF formats and limited by available memory).
The format of the data is platform-specific:
  • Windows: DIB (Device-Independent Bitmap)
  • Macintosh: A PICT image in memory
  • Linux: A TIFF image file in memory

Disk File

A Source is not required to support this transfer mode but it is recommended.

Buffered Memory

Every Source must support this transfer mode.

2-20 TWAIN 2.2 Specification


Т.е. native является обязательным режимом и установлен по умолчанию. В противном случае, источник является TWAIN-несовместимым.
Насчет расчета позиции пикселей. Вполне возможно, что в указанном коде есть ошибка, но ее выявить можно только в отладчике. Возможно источник данных присылает частично некорректную информацию о передаваемом изображении.
Nov 17, 2015 at 5:45 AM
Edited Nov 17, 2015 at 5:49 AM
SARAFF, хочется сказать большое спасибо за данный компонент!

В нативном режиме, если это не консольное приложение, после того, как изображение было сохранено, у меня выдает следующее исключение:
System.Runtime.InteropServices.ExternalException произошло
  ErrorCode=-2147467259
  Message=Неправильная инициализация GDI+ (внутренняя ошибка GDI+).
  Source=System.Drawing
  StackTrace:
       в System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)
  InnerException: 
Так же происходит при запуске тестовых приложений. Что странно, все примеры реализации twain, которые я нарыл в интернете, приводят к этой же ошибке, последней надеждой стал Saraff.Twain

Вот скрины отладчика при обработке события MemXferEvent (код скопирован из примера Buffered Memory Mode Transfer)
Image
Image
Image

Подсмотрел в чужом коде ссылка на код
Судя по комментарию у них такая же проблема.
//FIXME Некорректно работает с черно белыми изображениями на нашем сканере(нужно проверить)
Не могу понять, с чего начать исправлять данную ошибку
Nov 17, 2015 at 8:25 AM
Все, разобрался, биты нужно было читать слева направо:
заменил 
for (int _mask = 1; (_mask & 0xff) != 0 && j < e.ImageMemXfer.Columns;  _mask <<= 1, j++)
на
for (int _mask = 128; (_mask & 0xff) != 0 && j < e.ImageMemXfer.Columns;  _mask >>= 1, j++)
Image
Еще раз спасибо за прекрасную библиотеку!
Marked as answer by SARAFF on 11/25/2015 at 10:44 AM
Coordinator
Nov 17, 2015 at 4:47 PM
Добрый день, teges.
Спасибо за Ваше мнение о Saraff.Twain.NET.
Для определения направления битов можно воспользоваться ICAP_BITORDER ( Saraff.Twain.Twain32.Capabilities.BitOrder )
Marked as answer by SARAFF on 11/25/2015 at 10:44 AM