Autor Téma: Načítání obrázků  (Přečteno 2828 krát)

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Načítání obrázků
« kdy: 07-12-2012, 17:45:36 »
Přeji hezký den.

Používám pro načítání dat níže uvedený kod.

Zajímalo by mě, jak bych mohl do record ukladat obrazek a potom ho i načíst ???


Kód: Delphi [Vybrat]
  1.  
  2. type
  3.   TData = packed record
  4.  
  5.     ID     :  String[20];
  6.  
  7.     X1            : array[1..100] of Extended;
  8.     X2            : array[1..100] of Extended;
  9.     X3            : array[1..100] of Extended;
  10.     OemInt        : array[0..100] of Integer;
  11.     OemExt        : array[0..100] of Extended;
  12.     OemStr        : array[0..100] of String[100];
  13.  
  14.     PocetZaznamu  : Integer;
  15.  
  16. end;
  17.  
  18.  

a tady bych si přál mít i : Img    : TBitmap;


Kód: Delphi [Vybrat]
  1.  
  2.  
  3.  
  4.  
  5. //---------------------------------------------------------------------------------------------------
  6. //---------------------------------------------------------------------------------------------------
  7. function TForm1.OpenFileStream(const FileName: string): TFileStream;
  8. begin
  9.   if not FileExists(FileName) then begin
  10.     // Soubor otevreny s fmCreate nelze sdilet...
  11.     // Zde vytvorime, a pozdeji otevreme s fmShareDenyNone...
  12.     FileClose(FileCreate(FileName));
  13.   end;
  14.   Result:=TFileStream.Create(FileName,fmOpenReadWrite or fmShareDenyNone);
  15. end;
  16.  
  17.  
  18. procedure TForm1.WriteRecordToStream(Stream: TStream; RecIndex,RecSize: integer; RecData: Pointer);
  19. begin
  20.   Stream.Seek(RecIndex*RecSize,soFromBeginning);
  21.   Stream.WriteBuffer(RecData^,RecSize);
  22. end;
  23.  
  24.  
  25. procedure TForm1.ReadRecordFromStream(Stream: TStream; RecIndex,RecSize: integer; RecData: Pointer);
  26. var Offset: integer;
  27. begin
  28.   Offset:=RecIndex*RecSize;
  29.   Stream.Seek(Offset,soFromBeginning);
  30.   Stream.ReadBuffer(RecData^,RecSize);
  31. end;
  32.  
  33.  
  34. procedure TForm1.NactiDataStream(Typ: String; SouborEx : string; Zaznam: Integer);
  35. var Stream: TFileStream;
  36.     RecNo: Integer;
  37.     Cesta: string;
  38.     Soubor2: String;
  39. Begin
  40.  
  41.   RecNo:=Zaznam;
  42.   Soubor2 := ExtractFilePath(ParamStr(0))+'Data\' + SouborEx;
  43.   Stream:=OpenFileStream(Soubor2);
  44.  
  45.   try
  46.      if Typ = '01.Data'          then  ReadRecordFromStream(Stream,RecNo,SizeOf(TData),@Data);
  47.      if Typ = '01.Seznam'     then  ReadRecordFromStream(Stream,RecNo,SizeOf(TDataSeznam),@DataSeznam);
  48.      if Typ = '01.Sloupce'     then  ReadRecordFromStream(Stream,RecNo,SizeOf(TDataSloupce),@DataSloupce);
  49.   finally
  50.      Stream.Free;
  51.   end;
  52. end;
  53.  
  54.  
  55. procedure TForm1.UlozDataStream(Typ: String; SouborEx: String; Zaznam: Integer);
  56. var Stream: TFileStream;
  57.     RecNo: Integer;
  58.     Soubor2: String;
  59. Begin
  60.  
  61.   RecNo:=Zaznam;
  62.   Soubor2 := ExtractFilePath(ParamStr(0))+'Data\' +  SouborEx;
  63.   Stream:=OpenFileStream(Soubor2);
  64.   try
  65.     if Typ = '01.Data'          then  WriteRecordToStream(Stream,RecNo,SizeOf(TData),@Data);
  66.     if Typ = '01.Seznam'     then  WriteRecordToStream(Stream,RecNo,SizeOf(TDataSeznam),@DataSeznam);
  67.     if Typ = '01.Sloupce'     then  WriteRecordToStream(Stream,RecNo,SizeOf(TDataSloupce),@DataSloupce);
  68.   finally
  69.      Stream.Free;
  70.   end;
  71. end;
  72.  
  73.  
  74. //-----------------------------------------------------------------------------------------------------------------------------------------
  75. //-----------------------------------------------------------------------------------------------------------------------------------------
  76.  



pak jednoduše načítám např: NactiDataStream('01.Data', 'Data.dat', 0);
a data taham takto:  label1.caption := Data.ID;

ale jak udělám abych načetl obrázek???  něco jako Image1.Bitmap.. := Data.img;
a naopak, jak uložim obrázek ze souboru  do  Data.img


mockrát děkuji za ukázku jak na to.

Milan
« Poslední změna: 07-12-2012, 17:58:48 od AlienStar »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Načítání obrázků
« Odpověď #1 kdy: 07-12-2012, 21:11:01 »
Tak jak sis to vymyslel to jednoduse nepujde / navic to neni moc logicke.
navic ten tvuj brutalni zaznam ma striktni velikost, kdezto obrazek bude ruzne velky.

 Proc nepouzijes img.savetoFile do samostatneho souboru?
Embarcadero MVP - Czech republic

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Načítání obrázků
« Odpověď #2 kdy: 07-12-2012, 21:22:45 »
protože bych chtěl mít vše v jednom souboru ,,, od textů, číslic, po obrázky .

Takže teď nevím moc jak na to :-(

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Načítání obrázků
« Odpověď #3 kdy: 07-12-2012, 21:30:18 »
No jde to, ale musíš si to řídit sám. Nevystačíš si jen s jednoduchým zápisem TData. Musíš přinejmenším:
1) Zapsat TData.
2) Zapsat délku obrázku.
3) Zapsat data obrázku (např. pomocí Img.SaveToStream).
Při načítání naopak:
1) Načíst TData.
2) Načíst délku obrázku.
3) Vytvořit nový obrázek a dát jeho adresu do TData.Img.
4) Načíst obrázek ze streamu (Img.LoadToStream).

Obdobné operace pak pro každý string (s výjimkou shortstringů), každé dynamické pole, každou třídu atd. Možná pro představu, koukni se na nějaký jednoduchý datový formát, třeba na WAV, a zkus si promyslet, proč se tam všude ukládají nějaké hlavičky, ve kterých jsou uložené délky následujících dat. To by ti mělo pomoci s rozvržením, jak ukládat ten tvůj formát.

A ještě jedna praktická rada: Pokud nemáš nějaký zásadní důvod, proč si sám řídit ukládání dat, tak to nedělej. Buď použij nějakou databázi, nebo nějaký serializovatelný formát (XML, JSON). Ty jsou na ukládání dat dělané a všechny tyhle pracné opičárny už do nich někdo napsal, takže je nemusíš psát ty.

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Načítání obrázků
« Odpověď #4 kdy: 07-12-2012, 21:33:51 »
dost jsem projížděl internet a koukal jsem na XML formát, ale nikde jsem nenašel nějaké ukázky jak s ním pracovat,, nemáte něco?

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Načítání obrázků
« Odpověď #5 kdy: 07-12-2012, 21:46:57 »
ještě doplním ,,, použití XML s využitím komponenty TDataSource



Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Načítání obrázků
« Odpověď #6 kdy: 07-12-2012, 21:49:20 »
Buď použij nějakou databázi

U toho bych se v analýze zastavil. Pokud se bude jednat o aplikaci, která takových záznamů vytvoří několik
desítek (a to nemluvím o stovkách až tisících), určitě bych se nesnažil data serializovat do formátu jako JSON
nebo XML, ale raději bych se podíval na "jednosouborové" databáze jako např. SQLite.


Jinak alespoň jeden hint:
Citace
procedure TForm1.NactiDataStream(Typ: String; SouborEx : string; Zaznam: Integer);

Parametr Typ nemusí být string, ale vlastní enumerace - např.
Kód: Delphi [Vybrat]
  1. type
  2.   TDataType = (
  3.     dtData,    // namísto '01.Data'
  4.     dtList,    // namísto '01.Seznam'
  5.     dtColumns  // namísto '01.Sloupce'
  6.   );

Potom by se metoda NactiDataStream a její podmínka pro načtení záznamu dala upravit takto:

Kód: Delphi [Vybrat]
  1. procedure TForm1.NactiDataStream(Typ: TDataType; SouborEx: string; Zaznam: Integer);
  2. begin
  3.   ...
  4.   case Typ of
  5.     dtData: ReadRecordFromStream(Stream, RecNo, SizeOf(TData), @Data);
  6.     dtList: ReadRecordFromStream(Stream, RecNo, SizeOf(TDataSeznam), @DataSeznam);
  7.     dtColumns: ReadRecordFromStream(Stream, RecNo, SizeOf(TDataSloupce), @DataSloupce);
  8.   end;
  9.   ...
  10. end;

A volat se pak může např. takto:

Kód: Delphi [Vybrat]
  1. NactiDataStream(dtData, 'c:\file.xxx', 0);
« Poslední změna: 11-12-2012, 15:43:34 od TLama »

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Načítání obrázků
« Odpověď #7 kdy: 07-12-2012, 21:57:37 »
děkuji za upravu stringu TYP ,, vypadá to líp :-)

fakt už nějak nevím co použít.

záznamů v souboru nebude moc,, tak je mi jedno co to bude, ale potřeboval bych ukládat do souboru jak texty, tak čísla i pár obrázků ???

nejlíp i s nějakou ukázkou jak se s tím pracuje

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Načítání obrázků
« Odpověď #8 kdy: 07-12-2012, 22:37:56 »
nebo nějaký serializovatelný formát (XML, JSON). Ty jsou na ukládání dat dělané a všechny tyhle pracné opičárny už do nich někdo napsal, takže je nemusíš psát ty.

XML není zrovna moc efektivní na ukládání dat, u binárních to bude ještě horší, protože je musíš převést na nějaký textový tvar. Binární data tam AFAIK přímo uložit nemůžeš.

Offline ps

  • Mladík
  • **
  • Příspěvků: 61
  • Karma: 4
Re:Načítání obrázků
« Odpověď #9 kdy: 08-12-2012, 22:19:55 »
protože bych chtěl mít vše v jednom souboru ,,, od textů, číslic, po obrázky .
Odporúčam použiť bigtable od autora synopse. A môžeš použiť TSynBigTableMetaData alebo TSynBigTableRecord.

Príklad:
http://blog.synopse.info/post/2011/01/22/Synopse-Big-Table-1.12a

Fórum:
http://synopse.info/forum/viewforum.php?id=3
IDE: Latest Delphi - Mobile, Lazarus - Desktop, OS:Win 10 ,Linux Mint

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Načítání obrázků
« Odpověď #10 kdy: 09-12-2012, 07:08:11 »
Spíš tedy přemýšlím, že bych si udělal svůj datový soubor, kde bych měl jak texty , tak i pár obrázků .

Neměl by někdo něco k nahlédnutí ????

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Načítání obrázků
« Odpověď #11 kdy: 09-12-2012, 08:14:03 »
Já už jsem dávno svoje datové soubory vzdal a používám klasický zip. Dobře se to vytváří a udržuje a čtení z něho není zas takový problém.

Pokud máš XE2 tak v RTL je přímo jednotka zip - http://delphi.cz/post/Delphi-XE2-Zip-a-TOSVersion.aspx, pokud máš starší verze, tak můžeš použít 7z z http://www.progdigy.com/?page_id=13, nebo zip, který je součástí http://synopse.info/fossil/wiki?name=Downloads (dá se jednoduše z balíku vybrat a nemá externí knihovny). Ale jsou i další.

R.
« Poslední změna: 09-12-2012, 08:16:18 od Radek Červinka »
Embarcadero MVP - Czech republic