سلام
من از دلفی قدیمی استفده می کنم که از فایل gif پشتیبانی نمی کنه.بعد از هزار زحمت دارم از GDI+ برای ترسیم این فایل استفاده می کنم.متاسفانه راهی که بهش رسیدم طول وعرض تصویر رو تعیین نمی کنه.باید یک اندازه برای کانواس داشته باشم که تصویر کامل در اون ترسیم بشه.میتونم اندازه رو خیلی بزرگ بگیرم ولی سرعت پایین میاد.
یه کد پیدا کردم.تا حالا خوب کار می کرد ولی این کد هم در مورد یک فایل ایراد داره.
procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word);type
TGIFHeader = record
Sig: array[0..5] of char;
ScreenWidth, ScreenHeight: Word;
Flags, Background, Aspect: Byte;
end;


TGIFImageBlock = record
Left, Top, Width, Height: Word;
Flags: Byte;
end;
var
f: file;
Header: TGifHeader;
ImageBlock: TGifImageBlock;
nResult: integer;
x: integer;
c: char;
DimensionsFound: boolean;
begin
wWidth := 0;
wHeight := 0;


if sGifFile = '' then
Exit;


{$I-}
FileMode := 0; { read-only }
AssignFile(f, sGifFile);
reset(f, 1);
if IOResult <> 0 then
{ Could not open file }
Exit;


{ Read header and ensure valid file. }
BlockRead(f, Header, SizeOf(TGifHeader), nResult);
if (nResult <> SizeOf(TGifHeader)) or (IOResult <> 0) or
(StrLComp('GIF', Header.Sig, 3) <> 0) then
begin
{ Image file invalid }
Close(f);
Exit;
end;


{ Skip color map, if there is one }
if (Header.Flags and $80) > 0 then
begin
x := 3 * (1 shl ((Header.Flags and 7) + 1));
Seek(f, x);
if IOResult <> 0 then
begin
{ Color map thrashed }
Close(f);
Exit;
end;
end;


DimensionsFound := False;
FillChar(ImageBlock, SizeOf(TGIFImageBlock), #0);
{ Step through blocks. }
BlockRead(f, c, 1, nResult);
while (not EOF(f)) and (not DimensionsFound) do
begin
case c of
',': { Found image }
begin
BlockRead(f, ImageBlock, SizeOf(TGIFImageBlock), nResult);
if nResult <> SizeOf(TGIFImageBlock) then
begin
{ Invalid image block encountered }
Close(f);
Exit;
end;
wWidth := ImageBlock.Width;
wHeight := ImageBlock.Height;
DimensionsFound := True;
end;
'?': { Skip }
begin
{ NOP }
end;
{ nothing else. just ignore }
end;
BlockRead(f, c, 1, nResult);
end;
Close(f);
{$I+}
end;


procedure TForm1.FormCreate(Sender: TObject);
var
W,H:Word;
begin
GetGIFSize('1.gif',W,H);
ShowMessage(IntToStr(W)+#13+IntToStr(H));
end;

این هم فایل:
1.jpg
طول و عرض رو 44646و45717 بر می گردونه در حالیکه باید 635و954 برگردونه.
کسی کد دیگه ای سراغ نداره که قابل اطمینان باشه؟
در این صفحه هم اطلاعات اومده که ازشون سر در نمیارم(بماند که بلد نیستم یه بایت از فایل بخونم!)
http://www.onicos.com/staff/iz/formats/gif.html