Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

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

 
Vitalis   (2005-06-10 16:13) [0]

Задача стоит подсчет размера отсканированной картинки, разрешения и пр.
Заодно вывожу отсканированный участок на форму в Image. Но... почему-то все время выводится только первый отсканированный рисунок (визуально), а размеры, разрешения получаю правильно. Подскажите, где у меня ошибка.
Спасибо заранее

unit MainUnit;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 MultiTwain, Dialogs, Menus, ExtCtrls, ExtDlgs, StdCtrls;

type
 TMainForm = class(TForm)
   ScanImage: TImage;
   MainMenu1: TMainMenu;
   N3: TMenuItem;
   N4: TMenuItem;
   N5: TMenuItem;
   Label1: TLabel;
   Label2: TLabel;
   N6: TMenuItem;
   Label3: TLabel;
   lbHeight: TLabel;
   lbWidth: TLabel;
   lbResolution: TLabel;
   A1: TMenuItem;
   SaveDialog1: TSaveDialog;
   Label4: TLabel;
   OpenPictureDialog1: TOpenPictureDialog;
   lbStatus: TLabel;
   lbSquare: TLabel;
   N1: TMenuItem;
   procedure N2Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure N4Click(Sender: TObject);
   procedure N5Click(Sender: TObject);
   procedure N6Click(Sender: TObject);
   procedure A1Click(Sender: TObject);
   procedure N1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 MainForm: TMainForm;
 Shum_: real;
 ScanBitmap: TBitmap;

implementation

uses SetUnit;

{$R *.dfm}
var
 Resolution:integer;

procedure TMainForm.N2Click(Sender: TObject);
begin
 Close;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 ScanBitmap:=TBitmap.Create;
 Shum_:=1;
end;

procedure TMainForm.N5Click(Sender: TObject);
begin
 if SaveDialog1.Execute
 then ScanImage.Picture.SaveToFile(SaveDialog1.FileName);
end;

procedure TMainForm.N4Click(Sender: TObject);
var
dat: hBitMap;
PInfo: PBitMapInfoHeader;
Height, Width: integer;
i,j: longint;
k, l, shum: integer;
FiltPix: longint;
Square: real;
temp: TBitmap;

begin
 Twain_SelectImageSource(Handle);
 dat:=Twain_AcquireNative(Handle,0);
 if dat<>0 then begin
   PInfo:=GlobalLock(dat);
   Height:=PInfo.biHeight;
   Width:=PInfo.biWidth;
   lbWidth.Caption:= floatToStrF(100/PInfo.biXPelsPerMeter*Width,ffNumber,8,2);
   lbHeight.Caption:= floatToStrF(100/PInfo.biYPelsPerMeter*Height,ffNumber,8,2);
   Resolution:=round(2.54 * sqrt((Width * Height)/((100/PInfo.biXPelsPerMeter*Width)*(100/PInfo.biYPelsPerMeter*Height))));
   lbResolution.Caption:= IntToStr(Resolution) + " dpi";
   GlobalUnlock(dat);
   try
     ScanBitmap.Palette :=Twain_CreateDibPalette(dat);
     ScanBitmap.Width := Width;
     ScanBitmap.Height := Height;
     Twain_DrawDibToDC(ScanBitmap.Canvas.Handle,0,0,Width,Height,dat,0,0);
   except
     on EOutOFResources do
     MessageDlg("TBitMap: Нет ресурсов для загрузки изображения!",mtError,[mbOk],0);
   end;
 ScanImage.Picture.Graphic:=ScanBitmap;
 Twain_FreeNative(dat);
 end;

   lbStatus.Caption:="Идет обработка изображения!";
   temp:=ScanBitmap;
   temp.Monochrome:=True;
   Filtpix:=0;
   shum:= round(Resolution/25.4*Shum_);
   for i:=0 to ScanBitmap.Width-1 do
     for j:=0 to ScanBitmap.Height-1 do
       if temp.Canvas.Pixels[i,j] = 0 then begin l:=0;
                                            for k:=1 to shum-1 do if ((temp.Canvas.Pixels[i+k,j] = 0) and (temp.Canvas.Pixels[i-k,j] = 0)) or ((temp.Canvas.Pixels[i,j+k] = 0) and (temp.Canvas.Pixels[i,j-k] = 0)) then inc(l);
                                            if l + 1 >= shum then inc(FiltPix);
                                           end;
   Square:= Filtpix/(sqr(Resolution/2.54));
   lbSquare.Caption:= FloatToStrF(Square,ffNumber,8,2)+" кв. см";
   lbStatus.Caption:="";
end;

procedure TMainForm.N6Click(Sender: TObject);
begin
 Close;
end;

procedure TMainForm.A1Click(Sender: TObject);
var
i,j: longint;
k, l, shum: integer;
FiltPix: longint;
Square: real;
temp: TBitmap;

begin
 lbStatus.Caption:="Идет обработка изображения!";
 temp:=ScanBitmap;
 temp.Monochrome:=True;
 Filtpix:=0;
 shum:= round(Resolution/25.4*Shum_);
 for i:=ScanBitmap.Width-1 downto 0 do
   for j:=ScanBitmap.Height-1 downto 0 do
     if temp.Canvas.Pixels[i,j] = 0 then begin l:=0;
                                          for k:=1 to shum-1 do if ((temp.Canvas.Pixels[i+k,j] = 0) and (temp.Canvas.Pixels[i-k,j] = 0)) and ((temp.Canvas.Pixels[i,j+k] = 0) and (temp.Canvas.Pixels[i,j-k] = 0)) then inc(l);
                                          if l + 1 >= shum then inc(FiltPix);
                                         end;
 Square:= Filtpix/(sqr(Resolution/2.54));
 lbSquare.Caption:= FloatToStrF(Square,ffNumber,8,2)+" кв. см";
 lbStatus.Caption:="";
end;

procedure TMainForm.N1Click(Sender: TObject);
begin
SetForm.Show;
end;

end.


 
Eugene74   (2005-06-10 18:38) [1]

Я вряд ли смогу что-то подсказать по сути проблемы.
Но, может, стоит выложить куда-нибудь весь проект, включая MultiTwain (мне разные попадались)? Тогда, наверное, кто-то что-то смог бы подсказать. Ведь гораздо легче открыть проект и прогнать его в IDE, чем анализировать код "вручную".



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

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
4-1115626624
seregka
2005-05-09 12:17
2005.07.11
Компоненты для работы с BarCode reader


1-1119368947
aha
2005-06-21 19:49
2005.07.11
для хранения разных параметров программы пользуюсь компонентом


6-1112691724
_Andrey
2005-04-05 13:02
2005.07.11
popup сообщение


1-1119343930
alexa
2005-06-21 12:52
2005.07.11
Форма на самом верху


14-1118060340
Digitman
2005-06-06 16:19
2005.07.11
вновь об IntraWeb 5.0.43 ..