AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Programmfehler: "Grafikalgorithmus"

Ein Thema von VkPenguin · begonnen am 11. Jul 2012 · letzter Beitrag vom 12. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2   
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#1

Programmfehler: "Grafikalgorithmus"

  Alt 11. Jul 2012, 22:50
Guten Abend zusammen,
ich habe nocheinmal eine Frage zu einem Programm. Ich arbeite nun seit kurzen an einem Programm, dass etwa folgendes tun soll:
1. Man läd ein beliebiges Bild (.jpg zum Beispiel)
2. Nun wählt man eine bestimmte Farbe aus (z.B. Schwarz)
3. Das Programm entfernt alle Farben außer Schwarz, sodass es nurnoch Schwarz und Weiß gibt
4. Das Programm ersetzt das sich daraus ergebende Bild nun durch viele Kreise, die nach einen bestimmten Muster ausgewählt werden

Ziel soll es also sein, z.B. aus einem Bild mit einem Viereck ein Muster aus Kreisen zu machen, dem man den Ursprung aber noch ansehen kann.

-> Je kleiner der Abstand eines Punktes auf dem Bild zu einem Schwarzen Punkt, desto höher ist die Wahrscheinlichkeit, dass ein Kreis erstellt wird
-> Je kleiner der Abstand eines Punktes auf dem Bild zu einem Schwarzen Punkt, desto kleiner ist der Kreis wahrscheinlich

Ich bin ein recht unerfahrener Programmierer und das Programm ist auch noch nicht fertig, daher ist es nicht wunderlich, dass noch nicht alles funktioniert, aber ich habe einen Fehler, den ich mir einfach nicht erklären kann:

- Wenn ich das Programm mit einem eher großen Testbild starte kommt eine Exeptionmeldung während ich das Array befülle, in dem die Daten der Kreise (Position, Farbe, Radius) gespeichert werden
- Ich dachte mir, der Fehler entsteht vielleicht, weil das Array zu klein ist, also vergrößerte ich es, dann erhalte ich aber eine Fehlermeldung in einer Procedur, die NUR FRÜHER im Programm aufgerufen wird und NICHT mit dem Array in Verbindung steht. Wie kann das sein?

Wie gesagt, ich bin mir zwar bewusst das noch einige Fehler in dem Programm stecken, aber das ist doch eigentlich unmöglich....?

Vielen lieben Dank für eure Tipps!
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Programmfehler: "Grafikalgorithmus"

  Alt 11. Jul 2012, 23:10
...starte kommt eine Exeptionmeldung während ich das Array befülle,
Welche denn?

Bereichsüberschreitung?
ggf. wäre der Sourcecode recht hilfreich bei der Fehlersuche.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#3

AW: Programmfehler: "Grafikalgorithmus"

  Alt 11. Jul 2012, 23:20
Fehlermeldung: "Erste Gelegenheit für Exception bei $76C1B9BC. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00496FDD in Modul 'Bubbelzmain.exe'. Schreiben von Adresse 7EFB0000'. Prozess Bubbelzmain.exe (5128)"

Das Code normalerweise hilfreich ist dachte ich mir schon, nur weiß ich nicht, wie ich in diesem Falle geschickt passende Teile herausschneiden sollte. Ich könnte höchstens den vollständigen Code anbieten, aber dann ist es mühsam für euch, sich da erstmal einzulesen - mal abgesehen davon, dass er ja noch sehr frisch und unausgereift ist.

Bereichsüberschneidung kann ich mir, wenn ich dich richtig verstehe, nicht vorstellen, da es ja zwei getrennte Proceduren sind.

Danke aber für deine Antwort!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.973 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 09:42
Bereichsüberschneidung kann ich mir, wenn ich dich richtig verstehe, nicht vorstellen, da es ja zwei getrennte Proceduren sind.
Obacht!
ÜberschREITung, nicht ÜberschNEIDung!

Gehe mal auf Menü > Projekt > Optionen > Delphi-Compiler > Compilieren > Optionen für Laufzeitfehler
Dort die drei Optionen E/A-Prüfung, Überlaufprüfung und Bereichsüberprüfung aktiv schalten.
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#5

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 11:47
Ah, verlesen, Entschuldigung! Ich kenne die Optionen zwar nicht, du Du vorgeschlagen hast, aber ich erhalte immernoch dieselbe Fehlermeldung an derselben Stelle. Das Problem ist, dass ich mir das einfach nicht erklären kann und deshalb auch nicht weiß, wie ich weiter vorgehen soll
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.973 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:04
Ah, verlesen, Entschuldigung! Ich kenne die Optionen zwar nicht, du Du vorgeschlagen hast, aber ich erhalte immernoch dieselbe Fehlermeldung an derselben Stelle. Das Problem ist, dass ich mir das einfach nicht erklären kann und deshalb auch nicht weiß, wie ich weiter vorgehen soll
Ja nun, hast du denn die Optionen eingeschaltet?

Weiteres Vorgehen:
Den gesamten Quellcode posten.
Wir haben hier keine magische Glaskugel!
Entweder direkt oder als (ZIP-)Anhang.
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#7

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:59
Klar, die Optionen hatte ich an, konnte aber wie gesagt nichts feststellen. Hier ist mal der Quellcode, ich bin aber leider wie gesagt noch nicht sonderlich gut
Danke für Eure Mühe!
Delphi-Quellcode:
unit Bubbelz;
{V.0.2}
{Einige Stellen sind noch umständlich/ungenau in der Berechnung}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, ExtDlgs, StdCtrls, PNGImage;

type Kreis = record
X:Integer;
Y:Integer;
Radius:Integer;
Farbe:Integer;
end;

type
  TForm1 = class(TForm)
    Hauptbild: TImage;
    PIC_Load: TOpenPictureDialog;
    BT_PIC_Load: TButton;
    BT_Start: TButton;
    BT_Save: TButton;
    procedure FormCreate(Sender: TObject);
    procedure BT_PIC_LoadClick(Sender: TObject);
    procedure HauptbildClick(Sender: TObject);
    procedure AnalysePIC;
    procedure Progress(X:Integer;Y:Integer);
    function KleinstAbstandZuLinie(X:Integer;Y:Integer):Integer;
    function KleinstAbstandZuLinie2(X:Integer;Y:Integer):Integer;
    function AbstandZuPunkt(X1:Integer;Y1:Integer;X2:Integer;Y2:Integer):Integer;
    procedure BT_StartClick(Sender: TObject);
    procedure BT_SaveClick(Sender: TObject);
  private
    { Private-Deklarationen }

   Var PIc_res:Tbitmap;
   VAR PIC_RES2:TJpegImage;
   Var PIC:String ;
   VAR Maxentf:Real;
   Var PIC_Breite,PIC_Höhe,LinePTK,Kreisanzahl,Standartwahrscheinlichkeit,MaxRadius:Integer;
   VAR Line:Array[0..1600,0..1200] of Boolean;
       AbstLine:Array[0..1600,0..1200] of Integer;
       Kreise:Array[1..500000] of Kreis;
       KreisPTK:Array[0..1600,0..1200] of Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BT_PIC_LoadClick(Sender: TObject);
begin
Pic_Load.Execute();
PIC:=Pic_Load.FileName;
Hauptbild.Picture.LoadFromFile(PIC);
PIC_Res2.LoadFromFile(PIC);
PIC_Breite:=PIc_res2.Width;
PIC_Höhe:=PIC_res2.Height;
end;

function TForm1.AbstandZuPunkt(X1:Integer;Y1:Integer;X2:Integer;Y2:Integer):Integer;
Var Dx,Dy:Integer;
begin
Dx:=abs(X1-X2);
Dy:=abs(Y1-Y2);
result:=round(sqrt((Dy*Dy)+(Dx*Dx)));
end;

function TForm1.kleinstAbstandZuLinie(X:Integer;Y:Integer):Integer;
Var Kleinst,I,J,Abstand:Integer;
Begin
{//Zu umständlich//
Kleinst:=10000;
for I  := 0 to PIC_Breite do
Begin
for J  := 0 to PIC_Höhe do
Begin
if Line[I,J] then
Begin
Abstand:=AbstandzuPunkt(X,Y,I,J);
if Abstand<=Kleinst then Kleinst:=Abstand;
End;
End;
End;  }

End;

function TForm1.kleinstAbstandZuLinie2(X:Integer;Y:Integer):Integer;
Var I,J,Abstand,Zähler:Integer;
Begin
Abstand:=0;
if Line[X,Y] then result:=0
else
Begin
while Abstand=0 do
Begin
Zähler:=Zähler+1;
for I:=X-Zähler To X+Zähler Do if Line[I,Y-Zähler] then Abstand:=AbstandzuPunkt(X,Y,I,Y-Zähler);
for I:=X-Zähler To X+Zähler Do if Line[I,Y+Zähler] then Abstand:=AbstandzuPunkt(X,Y,I,Y+Zähler);
for I:=Y-Zähler To Y+Zähler Do if Line[X+Zähler,I] then Abstand:=AbstandzuPunkt(X,Y,X+Zähler,I);
for I:=Y-Zähler To Y+Zähler Do if Line[X-Zähler,I] then Abstand:=AbstandzuPunkt(X,Y,X-Zähler,I);
End;
End;
result:=Abstand;
End;

Procedure TForm1.Progress(X:Integer;Y:Integer);
VAR Abst,Radius:Integer;
P:Real;
begin
P:=(Random(100)+1)*(MaxEntf/(AbstLine[X,Y]*10));
if P<=Standartwahrscheinlichkeit then
Begin
//KREIS
Radius:=(Random(MaxRadius*100) div 100); //Nicht gewichtet
Kreisanzahl:=Kreisanzahl+1;
Kreise[Kreisanzahl].X:=X;
Kreise[Kreisanzahl].Y:=Y;
Kreise[Kreisanzahl].Radius:=Radius;
End;

end;





procedure TForm1.BT_SaveClick(Sender: TObject);
VAR Save:TJpegImage;
begin
Save:=TJpegimage.create;
Save.Assign(Hauptbild.Picture.Bitmap);
Save.SaveToFile('C:\Users\Felix\Desktop\Ergebnis.jpg');
end;

procedure TForm1.BT_StartClick(Sender: TObject);
var x,y,kleinst,m,k,größterAbstand:Integer;
begin
GrößterAbstand:=0;
AnalysePIC; //1.
for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
if Line[X,Y] then AbstLine[X,Y]:=0
else
Begin
AbstLine[X,Y]:=kleinstAbstandzuLinie2(X,Y);
if (AbstLine[X,Y]>GrößterAbstand) then GrößterAbstand:=AbstLine[X,Y];
END;
End;
End;

For m:=1 to GrößterAbstand Do
Begin
for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
if (AbstLine[X,Y]=M) then
Begin
Progress(X,Y);
End;
End;
End;
End;

for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
Hauptbild.Canvas.Pixels[X,Y]:=clWhite;
End;
End;

for X:=1 To Kreisanzahl Do Hauptbild.Canvas.Ellipse(Kreise[X].X,Kreise[X].Y,Kreise[X].X+Kreise[X].Radius,Kreise[X].Y+Kreise[X].Radius);

end;

procedure TForm1.AnalysePIC;
VAR I,J:Integer;
begin
for I := 0 to PIC_Breite do
Begin
for J := 0 to PIC_Höhe do
Begin
Line[I,J]:=False;
End;
End;

PIC_res.Assign(PIc_res2);

for I := 0 to PIC_Breite do
Begin
for J := 0 to PIC_Höhe do
Begin
if Pic_Res.Canvas.Pixels[I,J] = clBlack then
Begin
Line[I,J]:=True;
LinePTK:=LinePTK+1;
End
else Pic_res.Canvas.Pixels[I,J]:=clWhite;
End;
End;
Hauptbild.Picture.Assign(Pic_res);
MaxEntf:=sqrt(PIC_Breite*PIC_Breite+PIC_Höhe*PIC_Höhe);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MaxRadius:=PIC_Breite div 20;
Standartwahrscheinlichkeit:=90; //90%
PIC_Höhe:=1200;
PIC_Breite:=1600;
Form1.Top:=0;
Form1.Left:=0;
form1.width := screen.width;
form1.height := screen.height;
PIc_Res:=Tbitmap.Create;
PIC_res2:=TjpegImage.create;
end;

procedure TForm1.HauptbildClick(Sender: TObject);
begin
Pic_Load.Execute();
PIC:=Pic_Load.FileName;
Hauptbild.Picture.LoadFromFile(PIC);
PIC_Res2.LoadFromFile(PIC);
PIC_Breite:=PIc_res2.Width;
PIC_Höhe:=PIC_res2.Height;

end;

end.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 14:07
Variable Zähler in function TForm1.kleinstAbstandZuLinie2 ist vor dem 1. Zugriff undefiniert.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.463 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 14:08
In kleinstAbstandZuLinie2 ist Zähler nicht initialisiert, d.h. da steht irgendeine Zahl drin. Und Du solltest Dir dringend eine nachvollziehbare Einrückung angewöhnen, der Code ist sehr schlecht zu lesen. Übrigens musst Du Objekte, die Du zur Laufzeit erzeugst, auch wieder freigeben (das JPEGImage beim Speichern z.B.).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#10

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 14:14
Ah, vielen lieben Dank für eure Tipps, das werd ich gleich mal berichtigen. So einen Fehler hatte ich voher schonmal, das finde ich irgendwie sehr gewöhnungsbedürftig.. Das diese Codeeinrückung Sinn macht sehe ich ja ein, gibt es irgendwo festgelegte Regeln, die man nachlesen kann, damit es möglichst einheitlich ist?

*EDIT* Jetzt habe ich diesen Fehler -

Erste Gelegenheit für Exception bei $7580B9BC. Exception-Klasse ERangeError mit Meldung 'Fehler bei Bereichsprüfung'. Prozess Bubbelzmain.exe (5772)

- in der ersten For-Schleife nach Zähler:=Zähler+1; Aber wenn ich mir im Objektinspektor die Werte von den Variablen ansehen will um nachzusehen wo das Problem liegt, sind die Variablen nicht verfügbar. Gibt es da vielleicht einen Trick?

Geändert von VkPenguin (12. Jul 2012 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf