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

Метод передачи картинок через память

Mar 29 at 9:47 AM
Добрый день.
У меня возник вопрос по поводу передачи картинок методом Buffered Memory Mode Transfer
Если сканировать несколько картинок то в начале вызывается событие tw_SetupMemXferEvent
потом tw_MemXferEvent причем tw_MemXferEvent вызывается несколько раз. Это ясно.
И если сканируется следующая картинка то помять в начале вызывается tw_SetupMemXferEvent а потом опять несколько раз tw_MemXferEvent. Это ясно
все круто работает. Однако если не закрывая приложение и выполняя сканирование повторно (допустим одну картинку) то вызов функции tw_SetupMemXferEvent производится два раза Одна картинка а tw_SetupMemXferEvent вызывается два раза как будто гдето есть висящая картинки . В документации написано что надо вызвать операцию CONTROL / DAT_PENDINGXFERS / MSG_ENDXFER и как бы эта операция скажет драйверу твайн что приложение все получило
что делать для того чтобы твайн понял что я все картинки получил?
Mar 29 at 10:10 AM
оказывается второй раз подписывался на событие
Mar 29 at 12:56 PM
Edited Mar 29 at 3:21 PM
Подскажите пожалуйста
Пользуюсь кодом https://sarafftwain.codeplex.com/wikipage?title=Buffered%20Memory%20Mode%20Transfer&referringTitle=Documentation
Все ясно в стрим все записывается
Вот вопрос
В каком формате приходят данные?
это просто массив из RGB?
или другое?
что такое ppm?
Coordinator
Mar 29 at 4:48 PM
Добрый день, Aleksey1555.
Данные приходят в формате RGB.
PPM это такой формат растровых изображений. https://ru.wikipedia.org/wiki/Portable_anymap
Marked as answer by SARAFF on 4/8/2017 at 2:31 AM
Mar 30 at 7:49 AM
Edited Mar 30 at 7:56 AM
Ясно
Так получается что данные от сканера приходят в виде RGB и учитывая что ширина картинки width получается
что количество байт на строку будет 3*width.
А тут есть выравнивание? типа ширина строки должна быть кратна 4
или такого нет?
А зачем вы тогда делаете конвертацию в PPM?
Coordinator
Mar 30 at 9:51 AM
Добрый день, Aleksey1555.
Ну вообще-то, правильней использовать информацию о передаваемом изображении. Например, е.ImageInfo.SamplesPerPixel передает кол-во каналов на пиксель, e.ImageInfo.BitsPerPixel - количество бит на пиксель и т.д. есть выравнивание или нет - это зависит от конкретного источника данных, поэтому необходимо обязательно использовать информацию о передаваемом изображении. Более того, изображение может передаваться не полосами, а плитками (прямоугольниками). А еще, передаваемое изображение может быть сжато (если вы задаете ICAP_COMPRESION).
В PPM сохраняется для примера. Если Вы посмотрите код в Saraff.Twain.Sample2, то там сохраняется в TIFF.
Marked as answer by SARAFF on 4/8/2017 at 2:31 AM
Mar 30 at 11:17 AM
Edited Mar 30 at 11:24 AM
а вы в этом примере https://sarafftwain.codeplex.com/wikipage?title=Buffered%20Memory%20Mode%20Transfer&referringTitle=Documentation
написали код универсально? для любого случая?
или этот код поддерживает только режим rgb?
а может и другие тоже поддерживаются вашим кодом

А что если учесть всего 4 варианта?типа:
BW GRAY RGB Pallet

Ведь эти форматы должны поддерживаться любым сканером
разве не так?
Coordinator
Mar 30 at 2:26 PM
Добрый день, Aleksey1555.
В нем предусмотрены некоторые варианты, но, т.к. это пример, далеко не все.
Надо исходить из того, что супер универсального кода быть не может. Поэтому, если какой-то случай не вписывается в ваш код, то его и не нужно обрабатывать.
P.S. далеко не все сканеры поддерживают форматы пикселей BW GRAY RGB Pallet. существует ряд специализированных сканеров, которые поддерживают только определенный (не BW GRAY RGB Palle) формат пикселей.
Marked as answer by SARAFF on 4/8/2017 at 2:31 AM