1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| procedure TForm1.Button4Click(Sender: TObject);
var
src,dst: TBitmap;
lii: TLazIntfImage;//http://wiki.freepascal.org/Developing_with_Graphics#TLazIntfImage.LoadFromFile
function GetOffsetToDatas(b: TBitmap): integer;
var
bs: TBytesStream;
begin
bs := TBytesStream.Create;
b.SaveToStream(bs);
bs.Position:=10;
GetOffsetToDatas := bs.ReadDWord;
bs.Free;
end;
function funcload(f: String): TBitmap;
var
Pict: TPicture;
lii: TLazIntfImage;
begin
Pict := TPicture.Create;
Pict.LoadFromFile(f);
//Image1.Picture.Assign(Pict); // raies en diagonale
RESULT := TBitmap.Create;
RESULT.PixelFormat:=pf32bit;
lii := TLazIntfImage.Create(0,0);
try
//if OffsetToDatas = 54 then begin // synonyme de VersionHeader = 1
if GetOffsetToDatas(Pict.bitmap) = 54 then begin
lii.DataDescription := GetDescriptionFromDevice(0);
lii.LoadFromFile(f);
end else // 70, 122 pour bgra, 138 pour xbgr, n/a pour jpg et d'autres encore
lii.LoadFromBitmap(Pict.bitmap.Handle, Pict.bitmap.Handle, Pict.bitmap.Width, Pict.bitmap.Height);
RESULT.LoadFromIntfImage(lii); // renvoie un bitmap "bien" rempli
finally
lii.Free;
end;
Pict.Free;
end;
begin
opd.InitialDir := Application.Location;
if not opd.Execute then exit;
src := TBitmap.Create;
src.PixelFormat := pf32bit;
src := funcload(opd.FileName);
image1.Picture.Bitmap.Assign(src); // témoin "avant"
dst := TBitmap.Create;
dst.PixelFormat := pf32bit;
dst.Width := Image1.Picture.Bitmap.Width;
dst.Height := Image1.Picture.Bitmap.Height;
// plus efficace pour ouvrir les fichiers parfois étranges (xbgr...)
lii := TLazIntfImage.Create(0,0);
try
//if OffsetToDatas = 54 then begin // synonyme de VersionHeader = 1
if GetOffsetToDatas(dst) = 54 then begin
Caption := '54';
lii.DataDescription := GetDescriptionFromDevice(0);
lii.LoadFromFile(opd.FileName);
end else // 70, 122 pour bgra, 138 pour xbgr, n/a pour jpg et d'autres encore
lii.LoadFromBitmap(dst.Handle, dst.Handle, dst.Width, dst.Height);
image2.Picture.Bitmap.LoadFromIntfImage(lii); // renvoie un bitmap "bien" rempli pour le témoin "après"
finally
lii.Free;
end;
// ici les bytes corrects et "travaillables" devraient être dispo -- à tester...
dst.Free;
src.Free;
end; |
Partager