In een IBExpres aangemaakte tabel definieer ik een BLOB-veld van het type -1(door de gebruiker te definiėren). Hoe kan ik dat veld als een image-veld definiėren?
In een IBExpres aangemaakte tabel definieer ik een BLOB-veld van het type -1(door de gebruiker te definiėren). Hoe kan ik dat veld als een image-veld definiėren?
Een image-veld bestaat niet (echt).
Maak een memorystream, en schrijf deze weg.
Code:Procedure TFrmMain.Btn_Store_Image(Sender: TObject); Var AStream: TStream; MS: TMemoryStream; JPegImg: TJpegImage; Begin OpenDialog1.Title := 'Open Image'; If OpenDialog1.Execute Then Begin MS := TMemoryStream.Create; JpegImg := TJpegImage.Create; MS.LoadFromFile(OpenDialog1.Filename); ImgageX.Picture.Assign(JpegImg); // op scherm If Not(DataSource_Table.State In [DsEdit, DsInsert]) Then DataSource_Table.Edit; AStream := DataSource_Table.CreateBlobStream(DataSource_Table.FieldByName('IMAGE'), BmWrite); MS.Seek(0, SoFromBeginning); AStream.CopyFrom(MS, MS.Size); AStream.Free; End; End;
10.4.2, Delphi2010, of Lazarus 2.2.0
Bij het gebruik van het BLOB veld van type -1 geeft mijn programma de volgende foutmelding:
Ik kan dus de afbeelding niet opslaan. Misschien gebruik ik een verkeerd type veld om de afbeelding op te slaan. In dat geval: welk type veld moet ik gebruiken? (Eeen BLOB veld van het type Binair gaat ook niet: dat heb ik geprobeerd.)
Mmm, ik weet ook niet waarom (en zelfs hoe) je -1 zou gebruiken.
Ik gebruik altijd dit:
(Dus SUB_TYPE 0)SQL Code:
CREATE TABLE BESTAND ( ... OMSCHRIJVING BLOB SUB_TYPE 0 SEGMENT SIZE 80, DATA BLOB SUB_TYPE 0 SEGMENT SIZE 80, ... )^
Zie ook hier:
http://www.firebirdfaq.org/faq165/
0 - binary data (image, video, audio, whatever)
1 - text (basic character functions work)
2 - BLR (used for definitions of Firebird procedures, triggers, etc.)
Welke component uit 'Data controls' gebruik ik om een afbeelding zichtbaar te maken? Als ik onderstaande code, aangepast aan mijn siuatie, gebruik blijft de inhoud van het BLOB veld van het type 0(Binary) 'null'
procedure TFoLidToevoeg.DBImage1Click(Sender: TObject);
Var
AStream: TStream;
MS: TMemoryStream;
JPegImg: TJpegImage;
Begin
OpenDialog1.Title := 'Open Image';
If OpenDialog1.Execute Then
Begin
MS := TMemoryStream.Create;
JpegImg := TJpegImage.Create;
MS.LoadFromFile(OpenDialog1.Filename);
Image1.Picture.Assign(JpegImg); // op scherm
If Not(DmOkraLid.ZDsLeden.State IN [dsEdit, DsInsert]) Then // DataSource_Table.State In [DsEdit, DsInsert]) Then
DmOkraLid.ZDsLeden.Edit;
AStream := DmOkraLid.ZTaLeden.CreateBlobStream(DmOkraLid.ZTaL eden.FieldByName('Leden_Foto'), BmWrite);
MS.Seek(0, SoFromBeginning);
AStream.CopyFrom(MS, MS.Size);
AStream.Free;
End;
end;
Je zou gewoon TDBImage kunnen gebruiken. Dan moet je volgens mij wel de image ook via TDBImage laden en in de dataset laten zetten want ik meen me te herinneren dat TDBImage de size van de image als eerste in de blob zet. (dan kun je dus niet zomaar savetofile vanuit de blob want dan staat de size ervoor.) Maar als je gewoon altijd TDBImage gebruikt om de image weer te geven en te laden dan zou dat goed moeten werken.
Ik krijg het niet opgelost. Hoe kan ik de image via TDBImage laden en in de dataset zetten. Ik kan toch niet beschikken over een Image-veld?
DBImage1.Picture.Graphic.LoadFromFile(Filename);
Als het gewoon om een bitmap gaat.
Als het om een ander formaat gaat zul je die eerst in een ander component moeten lezen en dan overzetten naar.picture.graphic.
(Zoals je al had met Image1.Picture.Assign(JpegImg); )
Nadeel is dan wel dat het als een bmp formaat opgeslagen wordt. Wel je dat niet dan zul je op zoek moeten naar een TDBJpegImage component (of die TJpegImage zelf data-aware maken).
(Is Lazarus hier niet anders in dan Delphi? jpg support standaard ?)
Warempel... je hebt gelijk
Lazarus heeft ondersteuning voor jpeg "out of the box". Ook in het TDBImage component. Ik dacht even dat er intern toch BMP naar de database zou gaan maar ik heb het even gecontroleerd en er wordt toch echt JPEG opgeslagen.
Let er wel op dat intern in de database dus de imagegrootte en extensie in de blog opgeslagen wordt. Als je dus direct je DATA-field pakt en opslaat op HD dan is het geen JPG meer.Code:SQLQuery1.Insert; DBImage1.Picture.LoadFromFile('mijnplaatje.jpg'); SQLQuery1.Post; SQLQuery1.ApplyUpdates; TSQLTransaction(SQLQuery1.Transaction).CommitRetaining;
geeft dit als begin van bestand:Code:TBlobField(SQLQuery1.FieldByName('DATA')).SaveToFile('c:\temp\test.dat');
Je moet het dan dus altijd opslaan vanuit die TDBImage.Code:00000000h: 04 00 00 00 6A 70 65 67 FF D8 FF E1 23 FE 45 78 ; ....jpeg’Ų’į#žEx
Je kunt dit overigens wel uitzetten (die "header" ervoor). Dan moet je WriteHeader op false zetten. Je moet dan echter wel OnDBImageRead implementeren om bij het laden te bepalen welk formaat de image heeft. Je zou de jpg dus ook zelf apart in een veld op kunnen slaan zodat je BLOG/Data veld puur alleen de image-data bevat.Code:DBImage1.Picture.SaveToFile('mijnplaatje.jpg');
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks