(Gast)
n/a Beiträge
|
AW: Pixel aus Datei wieder geben
28. Dez 2012, 23:02
Zwischendurch habe ich das mal praktisch ausprobiert. Beim Einlesen muß es natürlich auch von 0 bis 299 statt von 1 bis 300 heißen, denn sonswt kommt es tatsächlich zu den abgesetzten Linien oben und links.
Ich habe mal die Umsetzung mit BlockWrite/BlockRead vorgenommen. Hier nur die entsprechenden Änderungen, allerdings nicht optimiert, sondern noch aus der Testphase :
Delphi-Quellcode:
f : file; // F:File of integer;
procedure TForm1.Button1Click(Sender: TObject);
var
filename:string;
filesize,len:Int64;
begin
if opendialog1.execute then
begin
filename:=opendialog1.filename;
end;
image1.picture.loadfromfile(filename);
image1.width:=image1.picture.width; // flexible Anpassung der Breite
image1.height:=image1.picture.height; // flexible Anpassung der Höhe
end;
procedure TForm1.Button2Click(Sender: TObject);
var
bildhoehe,bildbreite,zeile,spalte,farbe,X,Y: integer;
TestArray: array [0..299, 0..299] of integer;
index1,index2,farbe1: integer;
b:byte;
begin
application.processmessages;
bildbreite:=image1.width;
bildhoehe:=image1.height;
For index1:=0 to {299} bildbreite-1 do
begin
for index2:=0 to {299} bildhoehe-1 do
begin
TestArray[index1,index2]:=image1.canvas.pixels[index1,index2];
end;
end;
ASSIGNFILE(f,'NeuesBild.dat');
REWRITE(F,1);
blockwrite(f,image1.width,sizeof(bildbreite));
blockwrite(f,image1.height,sizeof(bildhoehe));
blockwrite(f,TestArray,bildhoehe*bildbreite*sizeof(integer));
Closefile(f);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
bildhoehe,bildbreite, menge,
index1,index2,farbe1: integer;
TestArray: array [0..299, 0..299] of integer;
// TestArray: array of array of integer;
begin
ASSIGNFILE(f,'NeuesBild.dat');
RESET(f,1);
//READ(F,farbe1);
blockread(f,bildbreite,sizeof(bildbreite));
blockread(f,bildhoehe,sizeof(bildhoehe));
menge:=bildbreite*bildhoehe*sizeof(integer);
//setlength(TestArray,menge);
//showmessage(inttostr(menge));
blockread(f,TestArray,menge);
Closefile(f);
image2.width:=bildbreite;
image2.height:=bildhoehe;
For index1:=0 to {299} bildbreite-1 do
begin
for index2:=0 to {299} bildhoehe-1 do
begin
image2.canvas.pixels[index1,index2]:=TestArray[index1,index2];
end;
end;
// Image2.Refresh; { must refresh before changes are displayed }
end;
BlockWrite/BlockRead haben den Vorteil, daß die Daten im Stück geschrieben bzw. gelesen werden. Das geht schneller als pixelweise vorzugehen. Wenn erst noch Breite und Höhe mitgespeichert werden, ist das alles etwas flexibler. Allerdings ist mir noch nicht geglückt, das mit offenen Arrays umzusetzen, so daß leider die Bildgröße doch noch vorher feststehen muß. Sicher wäre auch möglich, mit "ScanLine" statt mit Pixeln zu arbeiten, aber das kommt immer auf den Anwendungszweck an.
Geändert von delnu (28. Dez 2012 um 23:57 Uhr)
Grund: Korrektur : aus normalem Text "Delphi-Code" gemacht
|