/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Find forskelle på to billeder
Fra : Mathias


Dato : 21-08-04 23:39

Hej alle!

Jeg vil gerne lave et program der tager to .BMP filer med samme
størrelse og finder forskellene på disse. For at teste det har jeg
Billede1.bmp, et almindelig billede fra Paint, og Billede2.bmp, som er
en Billede1.bmp med en ekstra sort streg. Mit program henter så de to
billeder ind i hver deres TImage, Image1 & Image2, det fungerer fint. Så
har jeg Image3, som er "Outputtet".

Jeg tager hver pixel og sammenligner. forskellen printes så ud - pixel
for pixel - på Image3. Jeg får bare Integer Overflow på linien
"Image3.Canvas.Brush.Color := I4 - I3;".

Hvad er der galt - og hvordan reparerer jeg fejlen?

Jeg bruger Delphi 6 Personal, og min kode er som følger:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
I: Integer;
I2: Integer;
I3: LongWord;
I4: LongWord;
begin
Image1.Picture.LoadFromFile(Edit1.Text);
Image1.AutoSize := True;
Image2.Picture.LoadFromFile(Edit2.Text);
Image2.AutoSize := True;
If (Image1.Width <> Image2.Width) Or (Image1.Height <> Image2.Height)
Then
MessageDlg('Hovsa! Width & Height ikke ens!', mtError, [mbOK], 0)
Else Begin
Image3.Width := Image1.Width;
Image3.Height := Image1.Height;
For I := 0 To Image1.Height Do Begin
For I2 := 0 To Image1.Width Do Begin
Image3.Canvas.MoveTo(I2, I);
//ShowMessage(IntToStr(GetPixel(Image1.Canvas.Handle, I2, I)) +
#13#10 + IntToStr(GetPixel(Image2.Canvas.Handle, I2, I)));
I3 := GetPixel(Image1.Canvas.Handle, I2, I);
I4 := GetPixel(Image2.Canvas.Handle, I2, I);
If (I3 <> I4) > (I4 <> I3) Then
Image3.Canvas.Brush.Color := I3 - I4
Else
Image3.Canvas.Brush.Color := I4 - I3;
Image3.Canvas.LineTo(I2, I);
End; {For}
Application.ProcessMessages;
End; {For}
Image1.Visible := False;
Image2.Visible := False;
Image3.Visible := True;
End; {If}
end;

--
Mvh. Mathias | @: mathias *der* *bor* *på* mrside *i* dk 1
http://www.vitoo.dk/ - alle tiders community site 2
1234567890123456789012345678901234567890123456789012345678901234567890 3

 
 
Christen Fihl (22-08-2004)
Kommentar
Fra : Christen Fihl


Dato : 22-08-04 00:01

Det er nok fordi i4 er mindre end i3. Så bliver resultatet negativ, og
det kan du ikke gemme i en word eller longword.

Brug Integer's

--
Christen Fihl
http://HSPascal.Fihl.net/



Mathias (22-08-2004)
Kommentar
Fra : Mathias


Dato : 22-08-04 08:41

Nu er der Range Check Error på linien:

I3 := GetPixel(Image1.Canvas.Handle, I2, I);

Hvad er der nu galt? :(

--
Mvh. Mathias | @: mathias *der* *bor* *på* mrside *i* dk 1
http://www.vitoo.dk/ - alle tiders community site 2
1234567890123456789012345678901234567890123456789012345678901234567890 3

Thomas Finnerup (22-08-2004)
Kommentar
Fra : Thomas Finnerup


Dato : 22-08-04 09:54

On Sun, 22 Aug 2004 09:41:15 +0200, Mathias <nntp@mrside.dk> wrote:

> Nu er der Range Check Error på linien:
>
> I3 := GetPixel(Image1.Canvas.Handle, I2, I);
>
> Hvad er der nu galt? :(

Prøv at rette disse to

For I := 0 To Image1.Height Do Begin
For I2 := 0 To Image1.Width Do Begin

til

For I := 0 To Image1.Height - 1 Do Begin
For I2 := 0 To Image1.Width - 1 Do Begin


Venligst
Thomas

Mathias (22-08-2004)
Kommentar
Fra : Mathias


Dato : 22-08-04 10:34

Thomas Finnerup wrote:
> Prøv at rette disse to
>
> For I := 0 To Image1.Height Do Begin
> For I2 := 0 To Image1.Width Do Begin
>
> til
>
> For I := 0 To Image1.Height - 1 Do Begin
> For I2 := 0 To Image1.Width - 1 Do Begin

Tak for hjælpen!
Jeg har fået løst mit problem nu - både takket være dig og mig selv
Mange tak

--
Mvh. Mathias | @: mathias *der* *bor* *på* mrside *i* dk 1
http://www.vitoo.dk/ - alle tiders community site 2
1234567890123456789012345678901234567890123456789012345678901234567890 3

Christen Fihl (22-08-2004)
Kommentar
Fra : Christen Fihl


Dato : 22-08-04 10:38

Husk det Thomas sagde: Image1.Height - 1



I3 := GetPixel(Image1.Canvas.Handle, I2, I); << kan ikke gå
galt
I4 := GetPixel(Image2.Canvas.Handle, I2, I); << kan ikke gå
galt
If (I3 <> I4) > (I4 <> I3) Then << er vel
altid FALSE
Image3.Canvas.Brush.Color := I3 - I4 << udføres aldrig!!!
Else
Image3.Canvas.Brush.Color := I4 - I3; << udføres altid,
hvorfor i4 SKAL være mere end i3

Din IF ender vel med enten at sige:
if TRUE > TRUE then
eller
if FALSE > FALSE then

og begge IF'er er giver altid FALSE !


Hvad med at prøve dette (dog ikke samme resultat)
I3 := GetPixel(Image1.Canvas.Handle, I2, I);
I4 := GetPixel(Image2.Canvas.Handle, I2, I);
If I3 <> I4 Then
Image3.Canvas.Brush.Color := clRed
Else
Image3.Canvas.Brush.Color := clGreen;

--
Christen Fihl
http://HSPascal.Fihl.net/



Mathias (22-08-2004)
Kommentar
Fra : Mathias


Dato : 22-08-04 10:41

Hej Carsten!
Tak for hjælpen, jeg havde dog allerede fundet ud af de fejl, og som jeg
også har skrevet[1], /har/ jeg fået løst mit problem

[1] aLZVc.39807$Vf.2056604@news000.worldonline.dk

--
Mvh. Mathias | @: mathias *der* *bor* *på* mrside *i* dk 1
http://www.vitoo.dk/ - alle tiders community site 2
1234567890123456789012345678901234567890123456789012345678901234567890 3

Christen Fihl (22-08-2004)
Kommentar
Fra : Christen Fihl


Dato : 22-08-04 12:00

PS: Det er min bror der hedder Carsten

PS: Du bør nok læse lidt om ScanLine, så bliver din kode meget
hurtigere, da man så arbejder på en hel linie af gangen.
Kik i Borlands nyhedsgruppe på newsgroups.borland.com i gruppen der
ender i "BASM"

--
Christen Fihl
http://HSPascal.Fihl.net/



Mathias (22-08-2004)
Kommentar
Fra : Mathias


Dato : 22-08-04 13:35

Christen Fihl wrote:
> PS: Det er min bror der hedder Carsten
Jeg må være synsk

> PS: Du bør nok læse lidt om ScanLine, så bliver din kode meget
> hurtigere, da man så arbejder på en hel linie af gangen.
> Kik i Borlands nyhedsgruppe på newsgroups.borland.com i gruppen der
> ender i "BASM"
Tak for det!
Det prøver jeg

--
Mvh. Mathias | @: mathias *der* *bor* *på* mrside *i* dk 1
http://www.vitoo.dk/ - alle tiders community site 2
1234567890123456789012345678901234567890123456789012345678901234567890 3

Mathias (22-08-2004)
Kommentar
Fra : Mathias


Dato : 22-08-04 10:33

Hej igen...

Jeg har nu prøvet mig lidt frem, og har fået det til at virke
Jeg har fået et nyt problem, men det er off-topic i denne tråd.

Tak for hjælpen

--
Mvh. Mathias | @: mathias *der* *bor* *på* mrside *i* dk 1
http://www.vitoo.dk/ - alle tiders community site 2
1234567890123456789012345678901234567890123456789012345678901234567890 3

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste