Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   BW Film Source (https://www.delphipraxis.net/169588-bw-film-source.html)

freeway 30. Jul 2012 16:35

BW Film Source
 
Liste der Anhänge anzeigen (Anzahl: 2)
Vielleicht kann es der eine oder andere verwenden

Anhand der vorgegebenen "Farbe" wird ein graues Bild erzeugt

Delphi-Quellcode:
function BW_Film(Bild : TBitmap; hell,farbe : integer):boolean;
type TRGBArray = array[0..0] of TRGBTriple;
      PRGBArray = ^TRGBArray;

var x,y,r,g,b,summe,grau : integer;
    row : PRGBArray;
begin
  result := false;
  Bild.Pixelformat := pf32bit;
  r := GetRValue(farbe);                                                                                               //RGB Farben zuweisen
  g := GetGValue(farbe);
  b := GetBValue(farbe);

  summe := r + g + b;                                                                                                  //Gesamtsumme bilden
  if summe = 0 then summe := 1;                                                                                        //Divide zero vermeiden

  for y := 0 to Bild.Height-1 do
    begin
      Row := Bild.Scanline[y];
      for x := 0 to Bild.Width - 1 do
        with row[x] do
          begin
            //grau anteilig ermitteln
            //farbwert / gesamtsumme = Anteil der einzelnen Farbe * tatsächlichen wert

            grau := round(r / summe * rgbtRed + g / summe * rgbtGreen + b / summe * rgbtBlue + hell);                
            if grau > 255 then grau := 255;                                                                            //Bereichscheck
            if grau < 0 then grau := 0;

            rgbtRed  := grau;                                                                                         //neue Farbe zuweisen
            rgbtGreen := grau;
            rgbtBlue := grau;
          end;
    end;
  result := true;
end;

Sir Rufo 30. Jul 2012 16:48

AW: BW Film Source
 
Nur das man es so nicht verwenden kann.

Row ist nicht definiert
BMP0 ist nicht definiert
Bild wird nicht benutzt
hell, farbe doppelt definiert

himitsu 30. Jul 2012 17:10

AW: BW Film Source
 
Und wenn Bild keine 24 Bit pro Pixel besitzt, dann läuft es auch nicht.

freeway 30. Jul 2012 17:30

AW: BW Film Source
 
ihr habt recht, sollte jetzt passen

himitsu 30. Jul 2012 17:42

AW: BW Film Source
 
TRGBTriple?

TRGBTriple ist in jedem Delphi vorhanden? (in älteren hab ich jetzt noch nicht nachgesehn)
Hach, wie ich mir wünschen würde, wenn in der OH erwähnt würde, wann etwas eingeführt wurde, so wie man es vom MSDN kennen täte.

Tipp:
Delphi-Quellcode:
type
  TRGBArray = array[0..0] of TRGBTriple;
[0..0] hat eine besondere Bedeutung.
Delphi führt bei sowas nie eine Bereichsprüfungen durch, womit das quasi ein offenses statisches Array ergibt, welches mit 0 beginnt und kein Ende besitzt. (OK, unter Win32 ist bei 2 GB Schluß)

freeway 30. Jul 2012 18:51

AW: BW Film Source
 
>TRGBTriple ist in jedem Delphi vorhanden?

Ist kein direkter Bestandteil von Delphi sondern von Windows (SDK),
müsste Theoretisch mit weniger aktuellen Delphi (5 / 7 / 2009 / XE / XE2) oder Windows Versionen funktionieren

>unter Win32 ist bei 2 GB Schluß
JAIN, hängt davon ab wieviel Speicher am Stück freigegeben wird

madtom 30. Jul 2012 21:24

AW: BW Film Source
 
Ich bin ja nicht kleinlich, aber sollte eine Funktion nicht einen Rückgabe- bzw. Ergebnistyp haben? :-D

Delphi-Quellcode:
function BW_Film(Bild : TBitmap; hell,farbe : integer);
Gruß Thomas

freeway 30. Jul 2012 21:38

AW: BW Film Source
 
np, wenn dann richtig :)

himitsu 30. Jul 2012 22:07

AW: BW Film Source
 
Zitat:

Zitat von freeway (Beitrag 1176370)
np, wenn dann richtig :)

Falsch!

Deine Funktion gibt nun entweder True zurück, oder nichts (es gibt eine Exception).

Fazit: Das ist eine Prozedur.
= Sinnlose Rückgabewerte sind nutzlos.

grizzly 31. Jul 2012 08:05

[OT]
 
Zitat:

[0..0] hat eine besondere Bedeutung.
Delphi führt bei sowas nie eine Bereichsprüfungen durch
Seit wann das? In Delphi 6 bekomme ich da immer einen Range Check Error. Dann bleibt mir einerseits die Bereichsüberprüfung auszuschalten (dumme Idee während der Entwicklung), oder so einen Array selber zu definieren.

Gruß
Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz