Einzelnen Beitrag anzeigen

delnu
(Gast)

n/a Beiträge
 
#7

AW: Pixel aus Datei wieder geben

  Alt 28. Dez 2012, 22: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 22:57 Uhr) Grund: Korrektur : aus normalem Text "Delphi-Code" gemacht
  Mit Zitat antworten Zitat