Results 1 to 9 of 9

Thread: png-afbeeldingen uit database in image

  1. #1

    png-afbeeldingen uit database in image

    In een database staan meer dan 4000 png afbeeldingen. Deze afbeeldingen moeten nu weergegeven worden in een TImage. Het probleem is echter dat ik de melding krijg:
    The file being readed is not a valid "Portable Network Graphics" image, because it contains an invalid header. This file may be corrupted, try obtaining it again.
    Hoe kan ik nu dan toch die png afbeelding in mijn TImage krijgen??

    dit is de code die ik daar nu voor gebruik in D2007:
    Code:
    procedure TForm1.GetData;
    var
      bS  : TADOBlobStream;
      Pic : TPNGObject;
    begin
      edGameName.Text := tblItem.FieldByName('name').AsString;
      mmGameDescription.Text := tblItem.FieldByName('description').AsString;
      if not tblItemicon.IsNull then begin
        bS := TADOBlobStream.Create(tblItemicon, bmRead);
        try
          Pic:=TPNGObject.Create;
          try
            Pic.LoadFromStream(bS);
            imgIcon.Picture.Graphic:=Pic;
          finally
            Pic.Free;
          end;
        finally
          bS.Free
        end;
      end else begin
        imgIcon.Picture.Graphic := nil;
      end;
    end;
    Last edited by eagle00789; 08-Aug-08 at 15:44. Reason: code kleuring
    Check out ackspace.nl for a dutch hackerspace

  2. #2
    TCustomBuild Rob Bos's Avatar
    Join Date
    Jan 2003
    Location
    Eindhoven
    Posts
    4,213
    Sinds wanneer ondersteund Delphi TImgae standaard PNG ? Ik heb deze week nog een verhaal gezien dat dit in Delphi 2009 zal zitten.

  3. #3
    heb ik natuurlijk gedaan met een extra component zodat het wel ondersteund wordt.
    Check out ackspace.nl for a dutch hackerspace

  4. #4
    HaHa. ik heb het zelf al opgelost. hieronder de code:
    Code:
    procedure TForm1.GetData;
    var
      bS  : TADOBlobStream;
      Pic : TPNGObject;
    begin
      edGameName.Text := tblItem.FieldByName('name').AsString;
      mmGameDescription.Text := tblItem.FieldByName('description').AsString;
      if not tblItemicon.IsNull then begin
        bS := TADOBlobStream.Create(tblItemicon, bmRead);
        try
          bS.Seek(PNGStartsInBlob(tblItemicon), soFromBeginning);
          Pic:=TPNGObject.Create;
          try
            Pic.LoadFromStream(bS);
            imgIcon.Picture.Graphic:=Pic;
          finally
            Pic.Free;
          end;
        finally
          bS.Free
        end;
      end else begin
        imgIcon.Picture.Graphic := nil;
      end;
    end;
    
    function TForm1.PNGStartsInBlob (PicField:TBlobField):integer;
    var
      bS     : TADOBlobStream;
      buffer : Word;
      hx     : string;
    begin
      Result := -1;
      bS := TADOBlobStream.Create(PicField, bmRead);
      try
        while (Result = -1) and (bS.Position + 1 < bS.Size) do begin
          bS.ReadBuffer(buffer, 1);
          hx:=IntToHex(buffer, 2);
          if hx = '89' then begin
            bS.ReadBuffer(buffer, 1);
            hx:=IntToHex(buffer, 2);
            if hx = '50' then Result := bS.Position - 2
            else if hx = '89' then bS.Position := bS.Position-1;
          end; //if
        end; //while
      finally
        bS.Free
      end;  //try
    end;
    De code PNGStartsinblob zoek naar het begin van de png file (door middel van de hexcode 89 50) en van daaruit wordt de afbeelding pas ingeladen.
    Last edited by eagle00789; 08-Aug-08 at 15:46. Reason: Code kleuring
    Check out ackspace.nl for a dutch hackerspace

  5. #5
    Hoe zijn die afbeeldingen in je blob gezet? Als dat ook met een delphi tool is gedaan, dan staat er waarschijnlijk een header voor met de classname van de TGraphic waarin de afbeelding kan worden geladen.
    Als het altijd png images zijn, dan is jouw oplossing natuurlijk afdoende.
    1+1=b

  6. #6
    de afbeeldingen staan in een access database, die vanuit access ook ooit zijn toegevoegd. dus ik denk zo dat mijn oplossing ook meer dan afdoende is.
    Check out ackspace.nl for a dutch hackerspace

  7. #7
    Zo doe je het op dezelfde manier om een JPG uit te lezen. En dat werkt ook
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  8. #8
    ik meen me te herinneren dat ik dit voor een jpg namelijk hier heb gevraagd, maar kon het niet vinden. Wel heb ik inderdaad die zelfde code gebruikt, maar dan met de hexcodes natuurlijk voor een png
    Check out ackspace.nl for a dutch hackerspace

  9. #9
    Die staat hier, 2X raden wie dat postte
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

Thread Information

Users Browsing this Thread

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

Tags for this Thread

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
  •