Salut à tous,
Ce n'est pas la peine de passer par une chaîne.
A mon avis, tu t'y prends mal.
euh ... oui et non ^^
oui il s'y prend certainement mal (trop compliqué)
et non passer par une chaine a des avantages mais il faut procéder autrement ;)
je vous poste ici un projet de démo:
UFindJpegMain.pasunit UFindJpegMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, JPEG;
type
Tfrm_FindJpegMain = class(TForm)
img_Full: TImage;
btn_LoadJpeg: TButton;
OpenDialog1: TOpenDialog;
img_Thumb: TImage;
lbl_Full: TLabel;
lbl_Thumb: TLabel;
ckb_ViewFullImg: TCheckBox;
ScrollBox1: TScrollBox;
procedure btn_LoadJpegClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
frm_FindJpegMain : Tfrm_FindJpegMain;
implementation
{$R *.dfm}
uses StrUtils;
const // constante pour début d'image Jpeg
STR_JPEG_BEGIN: string = #$FF + #$D8 + #$FF;
type
// Record pour stocker les positions de l'image et de sa miniature
TImgPos = packed record
ImgStart: Int64;
MinStart: Int64;
end;
// recherche les positions de l'image et de sa miniature
function GetImagesPos(const aStrImg: string): TImgPos;
begin
ZeroMemory(@Result, SizeOf(Result));
with Result do begin
// Début de l'image
ImgStart := Pos(STR_JPEG_BEGIN, aStrImg);
// Début de la miniature
MinStart := PosEx(STR_JPEG_BEGIN, aStrImg, ImgStart + 1);
end;
end;
procedure Tfrm_FindJpegMain.btn_LoadJpegClick(Sender: TObject);
var
StrImg : string;
MS : TMemoryStream;
JPG : TJPEGImage;
ImgPos : TImgPos;
begin
if OpenDialog1.Execute then
begin
MS := TMemoryStream.Create;
// Charge l'image par un MemoryStream
with MS do try
LoadFromFile(OpenDialog1.FileName);
// on place le tout dans une chaine
// pas besoin de gerer la mémoire
// et on peut faire des recherches avec Pos & PosEx ou autres routines
SetLength(StrImg, Size);
MoveMemory(@StrImg[1], Memory, Size);
ImgPos := GetImagesPos(StrImg);
with ImgPos do begin
// si une miniature existe
if MinStart <> 0 then begin
// on positionne le Stream au début de la miniature
MS.Position := Pred(MinStart);
// puis on charge le résultat dans un TImage
if (img_Thumb.Picture.Graphic is TJPEGImage) then
TJPEGImage(img_Thumb.Picture.Graphic).LoadFromStream(MS)
else
begin
JPG := TJPEGImage.Create;
try
JPG.LoadFromStream(MS);
img_Thumb.Picture.Assign(JPG);
finally
JPG.Free;
end;
end;
lbl_Thumb.Caption := Format('Miniature size %d x %d',
[img_Thumb.Picture.Graphic.Width,
img_Thumb.Picture.Graphic.Height]);
end;
// et on recommence avec l'image entière si pas de miniature
if (ImgStart <> 0) and ((MinStart = 0) or ckb_ViewFullImg.Checked) then begin
MS.Position := Pred(ImgStart);
if (img_Full.Picture.Graphic is TJPEGImage) then
TJPEGImage(img_Full.Picture.Graphic).LoadFromStream(MS)
else
begin
JPG := TJPEGImage.Create;
try
JPG.LoadFromStream(MS);
img_Full.Picture.Assign(JPG);
finally
JPG.Free;
end;
end;
lbl_Full.Caption := Format('Image size %d x %d',
[img_Full.Picture.Graphic.Width, img_Full.Picture.Graphic.Height]);
end;
end;
finally
Free;
end;
end;
end;
end.
UFindJpegMain.dfmobject frm_FindJpegMain: Tfrm_FindJpegMain
Left = 204
Top = 124
Width = 957
Height = 596
Caption = 'Jpeg Miniature D'#233'mo'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
DesignSize = (
941
558)
PixelsPerInch = 96
TextHeight = 13
object img_Thumb: TImage
Left = 144
Top = 24
Width = 225
Height = 113
Proportional = True
end
object lbl_Full: TLabel
Left = 16
Top = 136
Width = 32
Height = 13
Caption = 'lbl_Full'
end
object lbl_Thumb: TLabel
Left = 144
Top = 8
Width = 49
Height = 13
Caption = 'lbl_Thumb'
end
object btn_LoadJpeg: TButton
Left = 8
Top = 24
Width = 75
Height = 25
Caption = 'Load Jpeg'
TabOrder = 0
OnClick = btn_LoadJpegClick
end
object ckb_ViewFullImg: TCheckBox
Left = 16
Top = 80
Width = 97
Height = 17
Caption = 'View full image'
Checked = True
State = cbChecked
TabOrder = 1
end
object ScrollBox1: TScrollBox
Left = 16
Top = 152
Width = 901
Height = 385
Anchors = [akLeft, akTop, akRight, akBottom]
TabOrder = 2
object img_Full: TImage
Left = 0
Top = 0
Width = 161
Height = 113
AutoSize = True
end
end
object OpenDialog1: TOpenDialog
Filter = 'Image jpg|*.jpg;*.jpeg'
Left = 8
Top = 48
end
end
FindJpeg.dprprogram FindJpeg;
uses
Forms,
UFindJpegMain in 'UFindJpegMain.pas' {frm_FindJpegMain};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(Tfrm_FindJpegMain, frm_FindJpegMain);
Application.Run;
end.
n'ayant pas plus de précisions sur la structure interne de tes fichiers cette exemple te donne une très bonne base de départ.
ps: vous constaterez qu'il n'est pas utile de fixer la fin des données de l'image ($FFD9) l'unité JPEG sait retrouver la taille réelle des données à afficher uniquement avec l'adresse de début de l'image.
Cordialement
@+ Cirec la belle voix de mon filleul