GraphicEx, loading from BlobField

I'm having trouble loading a TImage from a BlobField using GraphicEx. The GraphicFromContent is not returning a valid Graphicclass for Bitmaps or JPEGs.

*** I DO NOT STORE THE GRAPHIC'S EXTENSION IN THE DB***

That is the purpose of using GraphicFromContent using a Stream.

What am I doing wrong?  I need use this in the AfterScroll of the dataset to load a TImage based on what is stored in the blob and I
can not make changes to my table to save the stored graphic extension.

procedure LoadImageFromDB(ABlobField: TField; AImage: TImage);
  var
    NewGraphic: TGraphicClass;
    GraphicClass: TGraphicExGraphicClass;
    Stream : TStream;
  begin
    Stream := ABlobField.DataSet.CreateBlobStream(ABlobField, bmRead);
    // for some reason, Size is ALWAYS 0 however, it STILL
    // goes into the block ???..???
    if (Stream.Size > 0) then
    begin
      Stream.Position := 0;
      GraphicClass := FileFormatList.GraphicFromContent(Stream);
 
      if GraphicClass = nil then
        raise EInvalidGraphic.Create('UnknownExtension');
 
      NewGraphic := GraphicClass.Create;
      try
        AImage.Picture.Graphic := NewGraphic;
      finally
        NewGraphic.Free;
      end;
      AImage.Picture.Graphic.LoadFromStream(Stream);
 
      if AImage.Picture.Graphic <> nil then
        AImage.Picture.Graphic := nil;
      AImage.Picture.Graphic := NewGraphic;
    end;
  end;

Open in new window

LVL 26
Eddie ShipmanAll-around developerAsked:
Who is Participating?
 
developmentguruConnect With a Mentor PresidentCommented:
---------------------------------------------
---How do I register my new c lass---
---------------------------------------------

use the method of the FileFormatList RegisterFileFormat:

    procedure RegisterFileFormat(const Extension, Common, Individual: String; FormatTypes: TFormatTypes; Replace, RegisterDefault: Boolean; GraphicClass: TGraphicClass);

---------------------------------------------
---How do I create the new descendants, just a class or do they need something more?---
---------------------------------------------
The class that you register can be any descendant of TGraphic.  This is part of the issue that you ran into though.  In order to be returned by GraphicFromContent it has to be a descendant of TGraphicExGraphic.  TGraphicExGRaphic descends from TBitmap which descends from TGraphic.  You will need to look at the class definition and see which of the methods you will need to overload.  An important one would seem to be the class function CanLoad.  This would allow you to code the test to see if the class you are implementing can be loaded from the stream or resource (overridden methods for each).  

---------------------------------------------
---I said that I can not make changes to my table to save the stored graphic extension---
---------------------------------------------
I assumed you meant that you could not change the number (or type) of the database fields.  My suggestion would not cause either.

I hope you understand that I have never worked with these classes.  I gleaned this information from a few minutes perusing the source.

One last comment.  I would be sure to restore the stream position after you do any testing to what it was when the routine was entered.  As a precaution I would also set the position to zero before attempting to read the stream into the new graphics class.
0
 
developmentguruPresidentCommented:
 The method that you are using will only return class types that descend from TGraphicExGraphic.  The types that are registered for those extensions currently are the base types that Delphi defines.  It looks like, in order for this to work, you will need to create two new descendants of TGraphicExGraphic (one for bitmap and one for JPG).  Register them with the FileFormatList making sure to set the replace parameter to true.  If you implement the necessary elements of the TGraphicExGraphic base class you should be able to get it to start recognizing the file types.

  Another approach came to mind.  You could store the extension within the blob field prior to storing the blob itself.  This will work beautifully as long as no other software needs to use the blob field.

Let me know if you need more.
0
 
Eddie ShipmanAll-around developerAuthor Commented:
How do I register my new class with FileFormatList? How do I create the new descendants, just a class or do they need something more? I haven't worked with GraphicEx in a very long time.

[quote]Another approach came to mind.  You could store the extension within the blob field prior to storing the blob itself.  This will work beautifully as long as no other software needs to use the blob field.[/quote]
I said that I can not make changes to my table to save the stored graphic extension.
0
 
Eddie ShipmanAll-around developerAuthor Commented:
We actually went a different route with this one but thanks for the answer. I was unaware that we had ImageLib and thus the DBMultiImage control in their library afforded us to store any type of image in the DB. All I had to do was make a change to how the image was stored in the DB.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.