Forum: Multimedia
by Michael II,
6. Apr 2024
Wenn es dir um Effizienz geht (deine Scanline "Optimierung"), dann solltest du bei zeitkritischen Anwendungen auf die Callback Funktion verzichten. Damit sparst du viel mehr Nanosekunden ;-).
Und wenn du das nicht willst: In vielen Anwendungsfällen kannst du sicher auf die Weitergabe von x,y an deine Callbackfunktion verzichten.
Ich habe auch rasch gemessen: 1220x753 Bild, 1000 Durchläufe:
0:...
Forum: Multimedia
by Michael II,
1. Apr 2024
Ich in #13, #20, #25 auch ;-).
Forum: Multimedia
by Michael II,
31. Mär 2024
Hallo Thomas
ich weiss nicht was du in deiner _Callback tust - wahrscheinlich das in #1 ursprünglich verlangte (?).
Hast du deine Varianten 1,2,3 auf deinem Rechner auch "gegen" den Code aus #20 laufen lassen?
Gruss Michael
Forum: Multimedia
by Michael II,
18. Feb 2024
Hallo Thomas
geht beides - du müsstest in deinem Code dann halt noch faktor als UInt64 definieren und das kostet ein wenig und shift kannst du nicht als const definieren (shift ist bereits ein Rückgabewert). Wenn man diese Dinge berücksichtigt, dann läuft dein Code in 4.74ms und der vorgeschlagene in 3.42ms pro Million Aufrufe durch. Da man bei Farbmatrizen den Aufruf meistens nur maximal 3 Mal...
Forum: Multimedia
by Michael II,
12. Feb 2024
Hallo Thomas dein in #15 gezeigter 24Bit Bitmap Code auf #1 angewendet läuft bei mir nun in 1820ms (1000 Mal 1000x1000Pixel) durch.
procedure DZeuch(_SrcBmp, _DstBmp: TBitmap; Threshold: Byte);
const
BytesPerPixel = 3;
var
x: Integer;
y: Integer;
w: Integer;
h: Integer;
Forum: Multimedia
by Michael II,
12. Feb 2024
Bin gerade zu müde, um es nachzumessen ;-).
Du kopierst in deinen Schleifen Pixel für Pixel von Src nach Dst. Mit einem Assign wird das in einem Rutsch vor der Schleife getan und du kannst dich dann in der Schleife nur noch mit Dst beschäftigen und Src komplett weglassen.
Wie gesagt: Gemessen habe ich nicht - aber wenn das Assign() (seit es Assign() gibt) nicht schneller sein sollte als...
Forum: Multimedia
by Michael II,
11. Feb 2024
Eigentlich wollte ich ja nix mehr dazu schreiben, aber es "nervt" halt doch ein wenig, wenn behauptet statt gemessen wird ;-).
Fünf Mal 1000 Bilder der Grösse 1000x1000 umgewandelt.
Die in #1 vorgestellte Lösung benötigt auf meinem nicht mehr allzu frischen Notebook im Schnitt 4950ms.
Meine in #7 benötigt 2011ms und diese hier (unten) 1373ms (wobei man das ganz sicher schöner und auch ein...
Forum: Multimedia
by Michael II,
11. Feb 2024
Und da Threshold wahrscheinlich eh fast immer 0 ist geht's noch einfacher ;-).
Forum: Multimedia
by Michael II,
11. Feb 2024
Dann Sorry - macht es so wie es besser ist - ich lasse aber meinen Code als sehr schlechtes Beispiel stehen; ein Mahnmal für "wie man es nicht tun sollte". Danke für die wertvollen Inputs.
Forum: Multimedia
by Michael II,
11. Feb 2024
Dein Code ist viel zu kompliziert und dadurch auch langsam.
So könntest du es für 24Bit tun. Und für die anderen Formate natürlich ähnlich.
procedure CreateSpecialImage(const InBmp, OutBmp: TBitmap; Threshold: Byte);
var
OutPixel: PRgbTriple;
height, width, x, y: Integer;
begin