Results 1 to 10 of 10

Thread: Image veld

  1. #1

    Image veld

    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?

  2. #2
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    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

  3. #3
    Bij het gebruik van het BLOB veld van type -1 geeft mijn programma de volgende foutmelding:
    Click image for larger version. 

Name:	BlobType-1.jpg 
Views:	102 
Size:	36.5 KB 
ID:	7050
    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.)

  4. #4
    Mmm, ik weet ook niet waarom (en zelfs hoe) je -1 zou gebruiken.

    Ik gebruik altijd dit:
    SQL Code:
    1. CREATE TABLE BESTAND
    2. (
    3.   ...
    4.   OMSCHRIJVING            BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    5.   DATA                    BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    6.   ...
    7. )^
    (Dus SUB_TYPE 0)

    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.)

  5. #5
    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;

  6. #6
    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.

  7. #7
    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?

  8. #8
    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).

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    (Is Lazarus hier niet anders in dan Delphi? jpg support standaard ?)

  10. #10
    Quote Originally Posted by marcov View Post
    (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.

    Code:
      SQLQuery1.Insert;
      DBImage1.Picture.LoadFromFile('mijnplaatje.jpg');
      SQLQuery1.Post;
      SQLQuery1.ApplyUpdates;
      TSQLTransaction(SQLQuery1.Transaction).CommitRetaining;
    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:
    TBlobField(SQLQuery1.FieldByName('DATA')).SaveToFile('c:\temp\test.dat');
    geeft dit als begin van bestand:
    Code:
    00000000h: 04 00 00 00 6A 70 65 67 FF D8 FF E1 23 FE 45 78 ; ....jpeg’Ų’į#žEx
    Je moet het dan dus altijd opslaan vanuit die TDBImage.
    Code:
    DBImage1.Picture.SaveToFile('mijnplaatje.jpg');
    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.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •