![]() |
Prozentrechnung
Hallo
Ich habe ein problem mit der Prozentrechnung in delphi 7. Ich will den Prozentualen Anteil der Pixel in bestimmten Farben berechnen. Die Anzahl der Pixel in den Farben habe ich schon berechnet.
Delphi-Quellcode:
grau ist die anzahl der grauen pixel.
//Memo3.Lines.add(floattostr((grau)/(Image1.Picture.Bitmap.Width +1 * Image1.Picture.Bitmap.Height +1)*100) + '%');
was habe ich falsch gemacht? |
AW: Prozentrechnung
Hallo,
ich würde mal sagen, dass der Gesamtansatz zur Prozentberechnung falsch ist. Gehe es doch mal anhand eines einfachen Dreisatzes durch: Du hast eine Fläche von Width = 100 und Height = 100 Pixeln (also 100 * 100 Pixel = 10000 Pixel) und davon sind 5000 Pixel grau und 2500 gelb: graue Pixel: 10000 Pexel entspricht 100% 5000 Pixel entspricht X% X = 5000 * 100 / 10000 X= 50% gelbe Pixel: 10000 Pixel entspricht 100% 2500 Pixel entspricht X% X = 2500 * 100 / 10000 X = 25% Dein Code lautet z.B. für die grauen Pixels demnach wie folgt:
Delphi-Quellcode:
PxProCent := FloatToStr(CountedGreyPixels * 100 / (Image1.Picture.Bitmap.Width * Image1.Picture.Bitmap.Height));
Wenn Du das ganze jetzt noch in eine Funktion packst und farbunabhängig gestaltest, kannst Du zu jeder Farbe gleich Deine Prozent-Angaben mit derselben Funktion ausrechnen lassen. |
AW: Prozentrechnung
Du hast mindestens zwei Klammern vergessen:
Delphi-Quellcode:
(Image1.Picture.Bitmap.Width +1) * (Image1.Picture.Bitmap.Height +1)
//statt (Image1.Picture.Bitmap.Width +1 * Image1.Picture.Bitmap.Height +1) |
AW: Prozentrechnung
Wieso eigentlich das +1 jeweils? Die Größe sollte doch Höhe * Breite entsprechen, oder gibt es da Toleranzen, die mir bislang unbekannt sind?
|
AW: Prozentrechnung
Danke für die schnelle antwort:thumb:,
jetzt funktionierts |
AW: Prozentrechnung
Zitat:
|
AW: Prozentrechnung
Das sollte man IMO ja bereits im Vorfeld ausgeschlossen haben. Nur so wie jetzt wird ja das Ergebnis (wenn auch nur geringfügig) verfälscht.
|
AW: Prozentrechnung
Zitat:
|
AW: Prozentrechnung
Und wie hast Du das Problem jetzt gelöst?
Zeig doch mal Deine neue Code-Zeile. |
AW: Prozentrechnung
Ich tippe ja eher drauf, dass es eine leichte "in der Informatik wird ab 0 gezählt" Verwirrung war :lol:
|
AW: Prozentrechnung
Ach eins noch: wie kann man denn die nachkommastellen begrenzen?
|
AW: Prozentrechnung
|
AW: Prozentrechnung
Oder wenn es nur um die Ausgabe geht:
![]() |
AW: Prozentrechnung
Hier gleich mal der gesamte Quelltext:-D
ist aber noch nicht fertig ein paar farben Fehlen noch, wie z.B.gelb:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, ExtDlgs, jpeg, Menus, ComCtrls, MidasLib; type TForm1 = class(TForm) BitBtn1: TBitBtn; Image1: TImage; OpenPictureDialog1: TOpenPictureDialog; MainMenu1: TMainMenu; bildffnen1: TMenuItem; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; ProgressBar1: TProgressBar; Ende1: TMenuItem; procedure BitBtn1Click(Sender: TObject); procedure bildffnen1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Ende1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1:TForm1; y,u,v,b,r,g,maxu,maxv,minu,minv,z,maxz,minz:real; rot,blau,lila,gruen,schwarz,orange,grauweiss:integer; color:TColor; mein_jpeg: TJpegImage; mein_bmp: tBitmap; implementation {$R *.dfm} procedure TForm1.bildffnen1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.filename); end; end; procedure TForm1.BitBtn1Click(Sender: TObject); var x,y:Integer; begin ProgressBar1.position:=0; for x:=0 to Image1.Picture.Bitmap.Width -1 do begin //Progress Bar ProgressBar1.Max := Image1.Picture.Bitmap.Width +1; ProgressBar1.Position := ProgressBar1.Position+1; //Progress Bar Ende for y:=0 to Image1.Picture.Bitmap.Height -1 do begin color :=Image1.Picture.Bitmap.Canvas.Pixels[x,y]; b:=getbvalue(color); g:=getgvalue(color); r:=getrvalue(color); z:=(0.299*r)+(0.587*g)+(0.114*b); u:=(b-z)*0.493; v:=(r-z)*0.877; //Memo1.Lines.Add('r: ' + floattostr(r) + ' g: ' + floattostr(g) +' b: ' + floattostr(b)); //Memo2.Lines.add(floattostr(z) + floattostr(u) + floattostr(u)); //start Farbe verzweigungen if (z>0) and (z<121)then begin // y = 0 - 0.33 if (u>-112) and (u<16) and (v<157) and (v>33.64)then rot:=rot+1 else begin if (u<8) and (u>-64) and (v<33.64) and (v>11.21)then rot:=rot+1 else begin if (u<112) and (u>16) and (v<157) and (v>100.92)then lila:=lila+1 else begin if (u<112) and (u>32) and (v<100.92) and (v>33.64)then blau:=blau+1 else begin if (u<112) and (u>8) and (v<33.64) and (v>-157)then blau:=blau+1 else begin if (u<8) and (u>-8) and (v<11.21) and (v>-157)then gruen:=gruen+1 else begin if (u<-8) and (u>-112) and (v<0) and (v>-157)then gruen:=gruen+1 else begin if (u<64) and (u>-112) and (v<33.64) and (v>0)then gruen:=gruen+1 else begin if (u<-8) and (u>64) and (v<11.21) and (v>0)then gruen:=gruen+1 else begin if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then schwarz:=schwarz+1 end; end; end; end; end; end; end; end; end; end else begin if (z>120) and (z<171)then begin //y = 86 - 170 if (u<-16) and (u>-112) and (v<112.14) and (v>22.42)then orange:=orange+1 else begin if (u<16) and (u>-112) and (v<157) and (v>112.14)then orange:=orange+1 else begin if (u<112) and (u>-16) and (v<157) and (v>11.21)then lila:=lila+1 else begin if (u<122) and (u>8) and (v<11.21) and (v>-11.21)then blau:=blau+1 else begin if (u<112) and (u>0) and (v<-11.21) and (v>-157)then blau:=blau+1 else begin if (u<0) and (u>-112) and (v<-11.21) and (v>-157)then gruen:=gruen+1 else begin if (u<-8) and (u>-112) and (v<11.21) and (v>-11.21)then gruen:=gruen+1 else begin if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then grauweiss:=grauweiss+1; end; end; end; end; end; end; end; end else begin //y = 171 - 255 end; end; //ende Farbe verzweigungen end; end; Memo3.Lines.Add('Rot:' + inttostr(rot)); Memo3.Lines.add(FloatToStr(rot * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Violett:' + inttostr(lila)); Memo3.Lines.add(FloatToStr(lila * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Blau:' + inttostr(blau)); Memo3.Lines.add(FloatToStr(blau * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Grün:' + inttostr(gruen)); Memo3.Lines.add(FloatToStr(gruen * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Schwarz:' + inttostr(schwarz)); Memo3.Lines.add(FloatToStr(schwarz * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Orange:' + inttostr(orange)); Memo3.Lines.add(FloatToStr(orange * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); end; procedure TForm1.FormCreate(Sender: TObject); begin Memo1.lines.Delete(0); Memo2.lines.Delete(0); Memo3.lines.Delete(0); end; procedure TForm1.Ende1Click(Sender: TObject); begin close; end; end. |
AW: Prozentrechnung
Wie wär's mit einem
Delphi-Quellcode:
?
if (Bedingung) then
... else if (Bedingung) then ... else if (Bedingung) then ... |
AW: Prozentrechnung
im Prinzip hab ich das doch oder?
Außer dass das if...then eine zeile weiter unten steht. |
AW: Prozentrechnung
Er meinte wohl die Einrückungen, die gehen ja im Laufe der Zeit sehr weit nach rechts. Übrigens: wozu brauchst Du die ganzen globalen Variablen und die MidasLib?
|
AW: Prozentrechnung
Die variablen kommen aus den beta vesions zeiten alls das ganze noch nicht so funktionierte.
da hab ich mir die maximalen und die minimale y,u,v,r,g und b werte ausgeben lassen(RGB farbraum, YUV Farbraum) Midaslib stand so im internet damit dass programm unter windows nicht mehr abstürtzt. (machts aber trotzdem noch) |
AW: Prozentrechnung
Mach doch erst einmal aus den benötigten globalen Variablen lokale und lass die anderen weg. Zudem würde ich die Farbvariable nicht Color nennen, da das Formular eine gleichnamige Eigenschaft besitzt. Und dass das Programm abstürzt dürfte nicht an einer fehlenden MidasLib liegen.
|
AW: Prozentrechnung
vielleicht in der end-version
|
AW: Prozentrechnung
Aber wieso stürtzt dass dann immer noch ab :?:
ligt das vielleicht an dem color? |
AW: Prozentrechnung
Zitat:
|
AW: Prozentrechnung
Na gut aber warum stürzt das programm ab wenn mann es nicht über delphi startet
|
AW: Prozentrechnung
Kommt denn keine Fehlermeldung?
|
AW: Prozentrechnung
Nein, aber nach ein paar sekunden wird das formular weiß
|
AW: Prozentrechnung
Auch dann, wenn Du die Color-Variable anders nennst? Außerdem kann es gut sein, dass Dein Programm einfach etwas länger braucht, da der Zugriff über Canvas.Pixels schnarchlahm ist.
|
AW: Prozentrechnung
wenn man es von delphi aus compiliert dann bleibt dass bild aber vorhanden und die geschwindigkeit geht auch.
|
AW: Prozentrechnung
Das Programm läuft innerhalb der IDE schneller als außerhalb? Das interessiert mich jetzt aber, kannst Du mal die *.dpr, *.pas und *.dfm als Zip-Archiv anhängen?
|
AW: Prozentrechnung
Liste der Anhänge anzeigen (Anzahl: 1)
nicht ganz richtig, außerhalb von delphi läufts gar nicht.
habs in der zwischenzeit noch verbessert so das es jetzt alle farben außer schwarz erkennt. es geht außerdem nur mit bmp dateien. |
AW: Prozentrechnung
kann es sein dass Du mit Laufzeitpaketen kompiliert hast und die bpl's nicht gefunden werden?
Ich habe den Teil der Geschwindigkeit bringt mal kurz ausgetauscht:
Delphi-Quellcode:
type
pRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = ARRAY[0..$effffff] OF TRGBTriple; procedure TForm1.BitBtn1Click(Sender: TObject); var x,y:Integer; bmp:TBitMap; pLine: pRGBTripleArray; begin bmp := TBitmap.Create; bmp.Assign(Image1.Picture.Bitmap); bmp.PixelFormat := pf24Bit; try //Progress Bar ProgressBar1.Max := Image1.Picture.Bitmap.Width +1; //Progress Bar Ende Memo3.lines.Delete(0); ProgressBar1.position:=0; for Y := 0 to bmp.Height - 1 do begin ProgressBar1.Position := ProgressBar1.Position+1; pLine := bmp.ScanLine[Y]; for x := 0 to bmp.Width -1 do begin b := pLine[x].rgbtBlue; r := pLine[x].rgbtRed; g := pLine[x].rgbtGreen; z:=(0.299*r)+(0.587*g)+(0.114*b); u:=(b-z)*0.493; v:=(r-z)*0.877; if (z>0) and (z<121)then begin // y = 0 - 0.33 if (u>-112) and (u<16) and (v<157) and (v>33.64)then rot:=rot+1 else begin if (u<8) and (u>-64) and (v<33.64) and (v>11.21)then rot:=rot+1 else begin if (u<112) and (u>16) and (v<157) and (v>100.92)then lila:=lila+1 else begin if (u<112) and (u>32) and (v<100.92) and (v>33.64)then blau:=blau+1 else begin if (u<112) and (u>8) and (v<33.64) and (v>-157)then blau:=blau+1 else begin if (u<8) and (u>-8) and (v<11.21) and (v>-157)then gruen:=gruen+1 else begin if (u<-8) and (u>-112) and (v<0) and (v>-157)then gruen:=gruen+1 else begin if (u<64) and (u>-112) and (v<33.64) and (v>0)then gruen:=gruen+1 else begin if (u<-8) and (u>64) and (v<11.21) and (v>0)then gruen:=gruen+1 else begin if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then schwarz:=schwarz+1 end; end; end; end; end; end; end; end; end; end else begin if (z>120) and (z<160)then begin //y = 86 - 170 if (u<-16) and (u>-112) and (v<112.14) and (v>22.42)then orange:=orange+1 else begin if (u<16) and (u>-112) and (v<157) and (v>112.14)then orange:=orange+1 else begin if (u<112) and (u>-16) and (v<157) and (v>11.21)then lila:=lila+1 else begin if (u<122) and (u>8) and (v<11.21) and (v>-11.21)then blau:=blau+1 else begin if (u<112) and (u>0) and (v<-11.21) and (v>-157)then blau:=blau+1 else begin if (u<0) and (u>-112) and (v<-11.21) and (v>-157)then gruen:=gruen+1 else begin if (u<-8) and (u>-112) and (v<11.21) and (v>-11.21)then gruen:=gruen+1 else begin if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then grauweiss:=grauweiss+1; end; end; end; end; end; end; end; end else begin //y = 160 - 255 if z>159 then begin if (u<-32) and (u>-112) and (v<157) and (v>-44.85)then gelb:=gelb+1 else begin if (u<-24) and (u>-32) and (v<22.42) and (v>-44.85)then gelb:=gelb+1 else begin if (u<112) and (u>-32 ) and (v<157) and (v>22.42)then lila:=lila+1 else begin if (u<112) and (u>24 ) and (v<22.42) and (v>-11.21)then lila:=lila+1 else begin if (u<112) and (u>-24) and (v<-11.21) and (v>-157)then blau:=blau+1 else begin end; end; end; end; end; end; end; end; //ende Farbe verzweigungen end; end; Memo3.Lines.Add('Rot:' + inttostr(rot)); Memo3.Lines.add(FloatToStr(rot * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Violett:' + inttostr(lila)); Memo3.Lines.add(FloatToStr(lila * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Blau:' + inttostr(blau)); Memo3.Lines.add(FloatToStr(blau * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Grün:' + inttostr(gruen)); Memo3.Lines.add(FloatToStr(gruen * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Schwarz:' + inttostr(schwarz)); Memo3.Lines.add(FloatToStr(schwarz * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Orange:' + inttostr(orange)); Memo3.Lines.add(FloatToStr(orange * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); Memo3.Lines.Add('Gelb:' + inttostr(gelb)); Memo3.Lines.add(FloatToStr(gelb * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%'); finally bmp.Free; end; end; |
AW: Prozentrechnung
sorry aber was meinst du mit den laufzeitpaketen und bpl`s :oops:
|
AW: Prozentrechnung
Bei mir kompiliert und läuft es mit/ohne IDE
Eine Erklärung für Deinen Fehler wäre dass Du unter Projekt/Optionen/Mit Laufzeit-Packages aktualisieren angehakt hast und das Programm auf einen Rechner Testet wo die dann benötigten BPL's (bei Dir wahrscheinlich im Windowsverzeichnis) nicht vorhanden sind. |
AW: Prozentrechnung
Nein ich hab es nicht angehackt.
und ich teste es auch auf dem selben rechner wo ich es geschrieben hab. |
AW: Prozentrechnung
Hast Du dieses Problem bereits von Anfang an gehabt oder hat sich diese/dieses Verlangsamung/Aufhängen erst zwischendrin irgendwann eingestellt?
Zeichnest Du die ausgezählte Grafik selbst oder wird sie geladen? Ich hatte mal das Problem mit einem Icon, das es sich in einem Projekt beim einen Compilieren hat laden lassen, beim nächsten wieder nicht. War sehr seltsam und konnte nur beseitigt werden, indem ich die Icon-Datei neu angelegt habe. In einem anderen Thread der hier in der DP vor kurzem aktuell war, konnte ein Formular unter WIN XP anscheinend nicht richtig mit Verzögerung ausgeblendet werden, obwohl es keinen ersichtlichen Grund gab. Besodners lustig war dabei, das es unter Win 7 mit dem selben Compilat funktioniert hat. Hier half nur das Projekt neu aufzusetzen. Es ist manchmal lustig, aber oft hilft es eine Datei oder das Projekt selbst nochmal neu anzulegen und schon funktionieren die Dinge, bei denen man vorher so lange nach seinen eigenen Fehlern gesucht hat. |
AW: Prozentrechnung
danke ich werds versuchen
|
AW: Prozentrechnung
Zitat:
|
AW: Prozentrechnung
Ja stimmt aber dann fehler habe ich auch schon mitbekomme und habe ihn berichtigt :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz