Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Mai 15, 2024 01:14

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Gescheiter TBitmap.ScanLine-Ersatz
BeitragVerfasst: So Feb 24, 2013 17:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Moin,

welche Alternative zu TBitmap.ScanLine könnt Ihr mir für FPC/Lazarus empfehlen ? OPBitmap, BGRABitmap kompilieren nicht mal und mittels LazInftImage soll es ja gehen, wobei ich aber zugeben muss, dass ich nicht mal ansatzweise peile was der Typ da in seinem Beispiel treibt. Er kopiert es, arbeitet damit und kopiert zurück, das ist klar, aber der eigentliche ScanLine-Teil ist seltsam - sehe einfach keine Ähnlichkeit zum richtigen ScanLine.
Es geht ja im Prinzip nur darum den folgenden Code mit Lazarus zum Laufen zu kriegen, also irgendwie so zu übersetzen dass es annehmbar performant läuft. Habt Ihr da irgendwelche Vorschläge, wie man das erreichen könnte ? ScanLine ist eigentlich eine Funktion die man spontan gut einsetzen kann, daher gibt es auch viele andere die das Problem hatten, aber eine brauchbare Lösung hinterließ scheinbar niemand.
Code:
  1. procedure Beispiel(var Bitmap : TBitmap);
  2. var Row     : ^TRGBTriple;
  3.     H, V, a : Integer;
  4. begin
  5.   for V := 0 to Pred(Bitmap.Height) do
  6.   begin
  7.     Row := Bitmap.ScanLine[V];
  8.     for H := 0 to Pred(Bitmap.Width) do
  9.     begin
  10.       Row. ... := ...;
  11.       Inc(Row);
  12.     end;
  13.   end;
  14. end;  

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Feb 24, 2013 18:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Frage mich, in welchem Kontext du mit TBitmap arbeitest. Wenn du die sonstigen Canvas-Funkitonen nicht brauchst, ist es evenutell einfacher, mit einem Puffer aus TRGPTriplen zu arbeiten.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Feb 24, 2013 23:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hm, Du meinst dass man effektiv also jeden Pixel einzeln setzt ? Scanline ist schneller als das Setzen eines jeden einzelnen Pixels, was auch logisch ist, da ScanLine mit weniger Speicherzugriffen auskommt.
Finde das recht seltsam, im Prinzip müsste man sich doch ein ScanLine selbst bauen können. Zeiger auf Anfang der Zeile im Speicher und noch die Länge einer Zeile mitgeben irgendwie, sodass man dann den Block lesen und schreiben kann. Weiß aber nicht, wie sinnvoll das wirklich ist. An der Stelle wundert es mich dann nämlich, warum das nicht integriert ist, denn mein Vorschlag von eben müsste ja rein theoretisch gut übertragbar von System zu System sein, ist ja nichts besonderes dabei - aber gerade das macht mich skeptisch dass es so überhaupt geht.

Aber zu Deiner Idee: Du würdest eine Matrix aus dem Bitmap erstellen, mit der arbeiten und dann am Ende die Matrix wieder in ein TBitmap verwandeln ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 25, 2013 18:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, Scanline fasst auch jeden Pixel einzeln an. Der Vorteil, den du durch Scanline hast, ergibt sich dadurch, dass du nicht für jeden Pixel Methodenaufrufe machen musst, sondern direkt den Speicher manipulierst.

Das Problem der Übertragbarkeit ergibt sich, sobald du dir anschaust, wie die Systeme aufgebaut sind. Bei X11 z.B. muss die Bitmap nichtmal auf dem lokalen System liegen. Die kann auch auf dem X11-Server liegen und die einzelnen Canvas-Befehle werden in Remote Procedure Calls umgemappt. Da kommt man an den Speicher garnicht direkt dran.

Deswegen würde ich die Manipulationen notfalls halt in einer Kopie des RGB-Buffers machen – vorrausgesetzt, du kommst irgendwie dran…

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.025s | 17 Queries | GZIP : On ]