Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   imagen tif (https://www.clubdelphi.com/foros/showthread.php?t=66002)

Gimli 27-01-2010 12:00:25

imagen tif
 
Hola,
tengo una aplicacion delphi7 que recibe una cadena texto hexadecimal que se corresponde con una imagen tif
Necesito crear un algoritmo que transforme esa cadena de texto hexadecimal en un jpg y lo almacene en el disco duro.

Mi problema es que no he podido tratar satisfactoriamente el tif
He intentado almacenarlo en un Timage como contenedor temporal, pero no acepta el formato tif...
Tambien he intentado usar la libreria LibTiffDelphi, sin exito, no he sabido o no he encontrado la forma de hacer lo que necesito...

¿ Alguien a usado esta libreria con algun ejemplo sencillo, o a tratado archivos tif en delphi 7 ??
Seria un comienzo si puediera almacenar la cadena en un archivo tif en el disco duro..., pero tampoco he podido... Estoy atascado!

Gracias

Gimli 28-01-2010 19:35:11

Actualizo con más info.

La cadena hexadecimal empieza con 49 49 2A 00 y por lo tanto es un formato TIF INTEL - little endian, segun esta pagina: www
.garykessler.net/library/file_sigs.
html


¿Alguien a trabajado con este tipo de archivos?
¿o sabe como crear un fichero en el disco duro con la cadena hexadecimal que tengo?

Gracias...

Davidcfres 29-01-2010 11:13:20

Con GDI+
 
Hola,

Es muy simple con GDI+ :

Código Delphi [-]
procedure TForm1.Test1;
var
  Image: TGPImage;
  encoderClsid: TGUID;
  strMimeType : string;
begin
  Image:= TGPImage.Create('Apple.GIF');
  strMimeType := 'image/jpeg';
  GetEncoderClsid(strMimeType, encoderCLSID);
  Image.Save('test.jpg', encoderClsid);
  Image.free;
end;

puedes cargar la imagen desde la cadena con un MemoryStream

Código Delphi [-]
var
  MyStream : TMemoryStream;

...

  MyStream := TMemoryStream.Create;
  MyStream.Read( MyStrCadena, length(MyStrCadena) );
  Image.FromStream( MyStream );
  MyStream.Free;

con respecto al formataje de las cadenas en Delphi,
se puede que debes adaptar el MyStream.read

Código Delphi [-]
MyStream.Read( MyStrCadena{ o MyStrCadena+1 (AnsiChar)}, length(MyStrCadena) );

lo seguro, con un Array of char no tendras ningun problema.

algo Asi :

Código Delphi [-]
MyArray : Array [0..] of char;
MyStr : string;

...

FillChar( MyArray, length(MyArray),0);
CopyMemory(@MyArray[0], @MyStr[1], length(MyStr) );
...
MyStream.Read( @MyArray[0], length(MyArray));



David
Davidcfres at hotmail.fr

Je sais, je suis français, mais personne n'est parfait.

Gimli 29-01-2010 11:37:53

Donde puedo conseguir GDI+ ?, por mas que lo busco no lo encuentro...
me puedes facilitar un enlace o enviarmelo??, que ando un poco apurado...

Gracias

PD:
menos mal que me respondiste por que estaba intentando esto de aqui abajo y me decia que el tif tenia compresion y no dejaba abrirlo, por que GraphicEx no permite tif con compresion....


Código Delphi [-]
unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls, FileCtrl, StdCtrls, ComCtrls, ToolWin, Menus, DBCtrls, Db,
    ImgList, GraphicEx, pvtables, btvtables;

type
    TForm1 = class(TForm)
    Button1: TButton;
    imgImagen: TImage;
    DataSource1: TDataSource;
    PvTable1: TPvTable;
    PvTable1IMAGEN: TBlobField;
        procedure Button1Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
Tif : TTIFFGraphic;
Corriente : TMemoryStream;
Buffer : Word;
ImagenValida : Boolean;
begin
 pvtable1.open;

 ImagenValida := True;
 imgImagen.Picture.Graphic := Nil;
 If pvtable1IMAGEN.BlobSize > 0 Then
 Begin
    Corriente := TMemoryStream.Create;
    Try
     pvtable1IMAGEN.SaveToStream(Corriente);
     Corriente.Seek(0,soFromBeginning);
     If Corriente.Read(Buffer, 2) > 0 Then
     Begin
        Corriente.Seek(0,soFromBeginning);
        If (Buffer = $2020) Or (Buffer = $3A44) Or (Buffer = $4956) Then
        Begin
         imgImagen.Visible := False;
        End
        Else
        Begin
         imgImagen.Visible := True;
        End;
        Case Buffer Of
         $4D42 : imgImagen.Picture.Bitmap.LoadFromStream(Corriente); //Imagen BMP
         $0000 : imgImagen.Picture.Icon.LoadFromStream(Corriente); //Imagen ICO
         $0001 : imgImagen.Picture.Metafile.LoadFromStream(Corriente); //Imagen EMF
         $CDD7 : imgImagen.Picture.Metafile.LoadFromStream(Corriente); //Imagen WMF
         $4949 : //Imagen TIF, TIFF
         Begin
             Tif := TTIFFGraphic.Create;
             Tif.LoadFromStream(Corriente);
             imgImagen.Picture.Assign(Tif);
             Tif.Free;
         End;
    Begin
    imgImagen.Picture.Graphic := Nil;
    ImagenValida := False;
    End;
 End;
 End;
 Finally
    Corriente.Free;
 End;
 End;
end;

end.

Davidcfres 29-01-2010 11:54:09

www progdigy com/ files/ gdiplus.zip

msdn.microsoft.com/ en-us/ library/ ms533798(VS.85).aspx

dame un momento para leer tu ultimo post.

David

Gimli 29-01-2010 17:08:51

¿Conoceis algun componente estilo dbImage que enlace con la base de datos para mostrar una imagen TIF contenida en un campo blob ??
La imagen esta en formato INTEL little endian

Gracias


La franja horaria es GMT +2. Ahora son las 17:51:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi