Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2019.01.13;
Скачать: [xml.tar.bz2];

Вниз

Работа оо сканером   Найти похожие ветки 

 
Moff20   (2009-09-08 01:07) [0]

Добрый день, сразу прошу прощения если  вопрос не в ту тему, но вроде бы всё правильно.
Вопрос у меня следующий. Ответов на него я не нашёл не только у Вас на сайте, но и не могу найти во всём рунете.
В общем есть потоковый сканер (не планшетный, а который сканирует сразу пачку документов лист за листом, а также может сразу с двух сторон сканировать), и в нём необходимо производить сканирование сразу двух станиц (или одну с двух сторон). В интернете я нашёл очень хорошую статью, по использованию TWAIN технологий, и в принципе использовал её всё работает, но при сканировании только одного листа, или с одной стороны. А когда в сканерпринтер ложится сразу несколько страниц, при запуске сканирования, сканер прогоняет всю пачку листов, а код выхватывает изображение только последней страницы.
Помогите мне, как мне отслеживать каждый лист, точнее каждую страницу, если двух стороннее сканирование.

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


 
Moff20   (2009-09-08 01:08) [1]

ой код забыл

procedure TForm1.Accquire1Click(Sender: TObject);
var
dat: hBitMap;
PInfo: PBitMapInfoHeader;
Height,Width:integer;

{Функция возведения 2 в степень s}
function stp2(s:byte):longint;
var
m: longint;
i: byte;
begin
m:=2;
for i:=2 to s do m:=m*2;
stp2:=m;
end;

begin
{Получаем указатель на графические данные}
dat:=TWAIN_AcquireNative(Handle,0);
if dat <> 0 then begin
 {Получаем указатель на область памяти содержащей DIB
  данные и блокируем область памяти}
 PInfo:=GlobalLock(dat);
 {Анализируем полученные данные}
 Height:=PInfo.biHeight ;
 Width:=PInfo.biWidth ;
 {Узнаем размер полученного изображения в сантиметрах}
 Wcm.Caption :=floatToStrF(100/PInfo.biXPelsPerMeter*Width,ffNumber,8,3)+" cm";
 Hcm.Caption :=floatToStrF(100/PInfo.biYPelsPerMeter*Height,ffNumber,8,3)+" cm";
 {Определяем число цветов в изображении}
 Colors.Caption := floatToStrF(stp2(PInfo.biBitCount),ffNumber,8,0)+ " цветов";
 {Разблокируем память}
 GlobalUnlock(dat);
 {Передаем в битовую матрицу графические данные}
 {И устанавливаем перехват ошибок}
 try
  MyBitMap.Palette :=TWAIN_CreateDibPalette(dat);
  MyBitMap.Width := Width;
  MyBitMap.Height := Height;
  TWAIN_DrawDibToDC(MyBitMap.Canvas.Handle,0,0,Width,Height,dat,0,0);
 except
  {Обрабатываем наиболее вероятную ошибку связанную с не хваткой ресурсов
     для загрузки изображения}
  on EOutOFResources do
                      MessageDlg("TBitMap: Нет ресурсов для загрузки изображения!",
                                  mtError,[mbOk],0);
 end;
 {Отображаем графические данные}
 Image1.Picture.Graphic:=MyBitMap;
 {Освобождаем память занятую графическими данными}
 TWAIN_FreeNative(dat);
end;
end;


 
Сергей М. ©   (2009-09-08 10:09) [2]


> {Функция возведения 2 в степень s}


Это ты мощно задвинул)

function My2BasedPower(Exp: Cardinal): Cardinal;
begin
 if (Exp < 0) or (Exp > (SizeOf(Result) shl 3 - 1)) then
   raise EOverflow.Create("&#205;&#229;&#228;&#238;&#239;&#243;&#241;&#242;&#232;&#236;&# 251;&#233; &#239;&#238;&#234;&#224;&#231;&#224;&#242;&#229;&#235;&#252; &#241;&#242;&#229;&#239;&#229;&#237;&#232; !");
 Result := 1 shl Exp;
end;


 
Сергей М. ©   (2009-09-08 10:10) [3]

raise EOverflow.Create("Недопустимый показатель степени !");


 
Moff20   (2009-09-08 12:15) [4]

да это целиком дёрнутая процедура с
http://www.realcoding.net/articles/tekhnologiya-bez-interesnogo-imeni-ili-kak-rabotat-so-skanerom.html-0

Да и вобще данная статья очень распространена в инете. Поэтому когда вставлял данную процедуру в свою программу, не стал нарушать её целостность =) Она отлично работает. С одним "но".

В общем хорош глумиться, помогите, а то меня уже тянут за одно место =)
Мне тут подсказали, что Потоковый сканер на выходе обычно дает multipage image. То есть несколько картинок в одном файле. И мне это на самом деле не сильно помогло я всё равно не могу догнать, как вытягивать каждую страницу =(


 
Сергей М. ©   (2009-09-08 20:29) [5]


> дёрнутая процедура


Вот и "дергай" работающий код, если не в состоянии разрабатывать его своими мозгами.


> меня уже тянут за одно место


И правильно делают.


> хорош глумиться


Никто над тобой не глумится.
Ты зачем взялся за работу, в которой нишиша не понимаешь ?


 
Moff20   (2009-09-09 03:35) [6]

Я просил помочь, а не учить жизни! Код работает, он был ориентирован на планшетный сканер. Нужно переделать на потоковый сканер, если бы я был в состоянии его сам переделать, здесь бы вопрос свой не выкладывал, как мне показалось этот сайт и предназначен для тех у кого трудности. Работу дали (никто и не собирался за неё браться), со словами "Надо сделать". Прошу отвечать по теме тех, кто реально может помочь, а не у кого язык слишком длинный, для этого существуют отдельные темы форума.


 
Сергей М. ©   (2009-09-09 09:39) [7]


> Работу дали (никто и не собирался за неё браться), со словами
> "Надо сделать"


Вот и делай ее сам, а не чужими мозгами.

Отвечаю по теме: в составе TWAIN-интерфейса есть функции TWAIN_SetMultiTransfer и TWAIN_State

http://77.100.103.108/public/WinSoftware/scanning/EZTwain_User_Guide.pdf

Читать "How To: Transfer Multiple Images" до полного просветления


 
Moff20   (2009-09-10 02:34) [8]

Так Сергей, ты должен научить меня великому знанию Мау-Дзе Дун =) Изучил, разобрал, и всё равно не познал полного просветления. Во-первых в данном мануале все примеры кода на С++, где и указана описанная тобой некая функция TWAIN_SetMultiTransfer, которой к сожалению почему-то нет в Delphi компонентах twain. Зато есть функция TWAIN_GetNumDibs возвращающая количество изображений, которая почему-то не возращает ничего после вызова функции TWAIN_AcquireNative(Handle,0); хотя и указано, что данная функция возращает Хэндл только на последнее изображение, других функций нет, можети как-то надо в цикле очищать FreeNative и будет очищаться только последнее изображение и указатель перейдёт на предыдущее. Но ведь есть функция которая возвращает Хэндл сразу на определённое изображение по номеру GetDib. Вобщем у меня не получается... Как говорилось в фильме брат два "Бен, это Данила... I need Help"


 
Сергей М. ©   (2009-09-10 10:46) [9]


> все примеры кода на С++


И что ?
Чем он хуже Паскаля для понимания алгоритма ?
Проблемы индейцев шерифа не волнуют)


> функция TWAIN_SetMultiTransfer, которой к сожалению почему-
> то нет в Delphi компонентах twain


В составе D7 нет штатных компонетов, имеющих отношение к TWAIN.
Какими уж ты там компонентами пользуешься - я без понятия.


 
Moff20   (2009-09-10 11:16) [10]


> Какими уж ты там компонентами пользуешься - я без понятия.


Вот чем я пользуюсь http://speclab.narod.ru/multwain.zip
Вот есть вырезка из readme этого компонента, чётко указаны процедуры для мульти сканирования, но я так и не смог их выдресировать =(

* Standard TWAIN access routines:
  - TWAIN_SelectSource:  displays a dialog box to allow the user to
                         select a TWAIN device.  Accepts an HWND as
                         an argument, but sending it zero works fine.
  - TWAIN_AcquireNative:  returns a handle to a device-independent
                          bitmap (DIB) for the last image acquired (or
                          the only image, as the case may be).  Accepts
                          two arguments: an HWND and a pixmask.  Set
                          both to zero (I"ve had problems with my
                          camera when I specify the proper HWND).
  - TWAIN_FreeNative:  releases the memory owned by a DIB

* Routines to support acquisition of multiple images
  - TWAIN_GetNumDibs:  returns the number of images retrieved
  - TWAIN_GetDib:  returns a handle for the nth image retrieved
  - RegisterDibCallback:  designate an optional user-defined function  
                          to be called for each image transferred.  
                          Note that unfortunately the function
                          designated as a callback function *CANNOT* be
                          an object member function.  It MUST be
                          free-standing.
  - UnRegisterDibCallback:  tells the system not to call *any* user-
                            defined callback function


> И что? Чем он хуже Паскаля для понимания алгоритма? Проблемы
> индейцев шерифа не волнуют)


Алгоритм понятен абсолютно, я же говорю, что он работает только с функциями для Cpp, аналогичный алгоритм склепать у меня не вышло, и вобще это всё таки сайт мастеров Delphi.

Сергей мне нужна помощь на моём примере, вобщем я могу его хоть на изнанку вывернуть, лишь бы мне привели код хотя бы одного работающего примера для сканирования пачки листов, а не поучительные беседы о "вреде употребления алкоголя и табачной зависимости" =) Если помочь мне примером кода не в Ваших силах, тогда я извольте откланяюсь =)


 
Сергей М. ©   (2009-09-10 12:07) [11]


> мне нужна помощь на моём примере


У меня нет ни малейшего желания ковыряться в чужих компонентах и примерах сомнительного происхождения.

Существует официальный  EZTwain Pro Toolkit 3.08 - им и следует пользоваться.
В его составе д.б. Eztwain3.dll, в которой как раз и фигурирует ф-ция TWAIN_SetMultiTransfer, о которой как раз и есть упоминание в официальном документе по ссылке в [7].

И не надо изобретать кривые велосипеды)


 
Сергей М. ©   (2009-09-10 12:09) [12]


> примерах сомнительного происхождения


И уж тем более примерах с такой дебильной самодельной функцией, вычисляющей целую степень двойки.


 
Moff20   (2009-09-10 12:56) [13]


> У меня нет ни малейшего желания ковыряться в чужих компонентах
> и примерах сомнительного происхождения.


нет уж всё и запущено, всего та понять как оно работает в мульти режиме, оно же всё таки полюбому как-то работает... наверное =)


> Существует официальный  EZTwain Pro Toolkit 3.08 - им и
> следует пользоваться.


Ну дык с радостью приму ссылочку на него =) И ещё бы на его основе классно было бы увидеть пример потокового сканирования пачки листов реализованного на делфи =)


> И уж тем более примерах с такой дебильной самодельной функцией,
>  вычисляющей целую степень двойки.


Боже мой да что ты придрался к человеку, какая разница, может его прёт мастерить вручную математические функции =)


 
Сергей М. ©   (2009-09-10 13:04) [14]

Ты не умеешь искать информацию в заданном направлении ?
Не умеешь ее анализировать ?

Чего ты тогда делаешь в "WinAPI" ? Тому кто не в состоянии проглотить то что уже практически разжевано и в рот положено, место в "Начинающим")


 
Moff20   (2009-09-10 14:12) [15]

WinAPI это тот раздел форума куда подходит тема про сканирование и не как не раздел отличительных характеристик знаний программиста. Есть задание "Сканирование", необходимо его выполнить!
Могу и найти и проанализировать, боюсь на это уйдёт времени больше мне отведённого. Короче Сергей, я в первых же постах писал не надо меня жизни учить! Форум не психиатров, не хотите помогать - не надо, поболтать в чате можно. Либо помогайте (не учением жить людей), либо игнорируйте сообщения.


 
Moff20   (2009-09-10 14:45) [16]

Вот жеж мля... я скачал что ты мне посоветовал, там для дибилов мастер создания кода по пунктам сделан. Вот что сразу молчал я фигею =))) ладно я пока дома, тут у мну сканера нет, завтра на работе проверю, но думаю всё получится, там процедуры клепаются с комментариями =) так что обязан сказать спасибо огромное =)
Вот только скажи мне, зачем надо было вести демагогию такую, когда можно было в первом же ответет написать "ищи  EZTwain Pro Toolkit 3.08" и всё? Тебе надо тюремным психиатром идти =)

P.S. Это ещё не конец, может ещё вылезут ошибки какие-нить =)


 
Сергей М. ©   (2009-09-10 15:04) [17]


> я скачал что ты мне посоветовал


Ну наконец-то) ..Туго до тебя доходит, ой туго) .. Как до жирафа)


> что сразу молчал


Насчет чего ?
Про то что там для дибилов ?
А я почем знаю, что там внутри ?
Я еще пока умом не тронулся, чтобы качать все что ни попадя, ради того чтобы ублажать каждого встречного жирафа)


> можно было в первом же ответет написать "ищи  EZTwain Pro
> Toolkit 3.08


Да я его в первый раз в глаза увидел к моменту 7-го поста)
Оно мне надо - сканером твоим страдать ?)
Мне было вполне достаточно немного погуглить, чтобы найти правильное направление к решению задачи.


 
Сергей М. ©   (2009-09-10 15:05) [18]


> зачем надо было вести демагогию такую


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


 
Moff ©   (2009-09-10 16:04) [19]

ну почему бездумно сразу? Код который я впихнул себе я разобрал полностью, просто потом столкнулся с данной проблемой, я ж не втупую сдёрнул процедуру, у меян в программе она ведь переделана сильно =)


 
Сергей М. ©   (2009-09-10 16:13) [20]

А зачем тогда цитируешь оригинальный хлам ?


 
Moff ©   (2009-09-11 00:14) [21]


> А зачем тогда цитируешь оригинальный хлам ?


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

Вот плохо, что dll там уже не свободная, а требует покупки лицензии =( я вот думаю, а ведь были же у них и свободные dll раньше, если найти такую свободную версию и заменить прокатит интересно?


 
AntiZOG   (2009-09-15 02:05) [22]


> Moff20   (08.09.09 01:07)  


Если XP и выше то попробуй WIA (Windows Image Acquisition)
http://msdn.microsoft.com/en-us/library/ms630368%28VS.85%29.aspx

TWAIN уже устаревший интерфейс.

c WinXP идёт WIA - для поддержки сканеров, фотоаппаратов и веб-камер


 
Wind ©   (2010-11-26 13:13) [23]

Лови. Сам с такой проблемой сталкивался.
http://www.delphimaster.ru/cgi-bin/forum.pl?&id=1290598419&n=18&p=1


 
Wind ©   (2010-11-26 13:14) [24]

Лови. Сам с такой проблемой сталкивался.
http://www.delphimaster.ru/cgi-bin/forum.pl?&id=1290598419&n=18&p=1


 
RGV ©   (2010-11-26 18:26) [25]

что то автор топика молчит, как насчет спасибо to  Wind ©?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2019.01.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.002 c
4-1252357661
Moff20
2009-09-08 01:07
2019.01.13
Работа оо сканером


2-1476918568
Artem78
2016-10-20 02:09
2019.01.13
Событие Change у TCollection


2-1476199440
QAZ
2016-10-11 18:24
2019.01.13
строка как объект в коде


15-1476480602
Юрий
2016-10-15 00:30
2019.01.13
С днем рождения ! 15 октября 2016 суббота


11-1267550254
Gyurza
2010-03-02 20:17
2019.01.13
Анимированная иконка в трее





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский