![]() |
Array mit Farbwerten befüllen
Hallo!
Ich sitze gerade an einem Programm, dass eine Grafik mit einem sogenannten TiltShift-Filter (das was aussieht, wie auf der Modellbahn) versehen soll. Dazu ist es notwendig, drei Arrays mit Farbwerten zu befüllen. Der Code des Verfahrens stammt von Roy Magne Klever ( ![]()
Code:
Die kommentierte Schleife wirf aber Fehler bei der Bereichsprüfung.
var aR, aG, aB: array[0..255] of Byte;
procedure TfrmMain.FormCreate(Sender: TObject); var i, p: Integer; pfad: string; C: ColorRef; B, G, R: Byte; begin ImgLoaded := False; TheImage := TBitmap.Create; Img := TBitmap.Create; Img.PixelFormat:= pf24bit; // Setup selection color C := ColorToRGB(clHighlight); B := Byte(C shr 16); G := Byte(C shr 8); R := Byte(C); // hier kommen Fehler bei der Bereichsprüfung for i := 0 to 255 do begin aR[i] := (R - i) shr 1 + i; aG[i] := (G - i) shr 1 + i; aB[i] := (B - i) shr 1 + i; end; imgView.Picture.Bitmap.Width := 1; imgView.Picture.Bitmap.Height := 1; imgView.Picture.Bitmap.Canvas.Pixels[0, 0] := $001A1A1A; LY := -1; PT1.X:= 20; PT1.Y:= imgView.Picture.Bitmap.Height shr 1; PT2.X:= imgView.Picture.Bitmap.Width - 21; PT2.Y:= imgView.Picture.Bitmap.Height shr 1; DoNow:= False; end; Nun meine Fragen: 1. Was macht die Schleife überhaupt? 2. Wie könnte man das so programmieren, dass es bereichskonform wird? Danke für Eure Antworten! |
AW: Array mit Farbwerten befüllen
Erstmal was zum besseren Codeverständnis.
![]() ![]() Bereichsprüfung <> Indexprüfung
Delphi-Quellcode:
wird wohl ab und an negative Werte erzeugen, welche natürlich nicht in ein Byte rein passen.
(R - i)
Und insgesamt können durch das
Delphi-Quellcode:
auch zu große Werte entstehen,
+ i
also <0 oder >255. * Bereichsprüfung deaktivieren (standardmäßig ist die eh aus, also bist du wohl selbst Schuld) und den "Überlauf" ignorieren * ein harter Cast und den Überlauf abschneiden * vorher Prüfen und erst garnichts Negatives berechnen * oder * oder * ... |
AW: Array mit Farbwerten befüllen
Delphi-Quellcode:
Angenommen B sei 0 und i sei 255.
for i := 0 to 255 do
begin aR[i] := (R - i) shr 1 + i; aG[i] := (G - i) shr 1 + i; aB[i] := (B - i) shr 1 + i; end; Dann wird aus
Delphi-Quellcode:
ein
aB[i] := (B - i) shr 1 + i;
Delphi-Quellcode:
oder ausgerechnet
aB[255] := (0 - 255) shr 1 + 255;
Delphi-Quellcode:
(meint zumindest mein PascalScript dazu).
aB[255] := -2147483521;
Und das passt beim besten Willen nicht in ein Byte. Ansonsten Debugger starten und dort beim Auftreten des Fehlers nachschauen, um welche Werte es sich beim Auftreten des Fehlers handelt. Die Bereichsprüfung bezieht sich halt nicht nur auf die korrekte Einhaltung der Indexwerte bei 'nem Array, sondern auch um die korrekte Zuweisung von Werten zu Variabeln. |
AW: Array mit Farbwerten befüllen
Zitat:
Und irgendwie muss man dem Schlingel ja beikommen. Zitat:
|
AW: Array mit Farbwerten befüllen
Delphi 7 kannte sie schon und das war fast aus dem letzten Jahrtausend. :angle:
Das ist leider etwas, was viele Komponentenentwickler vergessen. Wenn ihr Code "absichtlich" mit Überläufen arbeitet (z.B. bei fast allen Verschlüsselungen), dann muß man "für seinen Code" das in seiner Unit abschalten. So ist es egal, wenn es für den restlichen Code global aktiviert wird. |
AW: Array mit Farbwerten befüllen
Heißt also einfach:
Am Anfang der Unit ein {$R-} einfügen (und fertig ist die Laube ;-))? |
AW: Array mit Farbwerten befüllen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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