PDA

View Full Version : سوال: خواندن فایل انیمیشن Gif به صورت فریم به فریم و ذخیره در ارایه دو بعدی و ذخیره در فایل باینری



Naderenator
شنبه 02 دی 1391, 00:03 صبح
سلام
من کد زیر را برای کاری که در عنوان گفتم نوشتم ابتدا به تعداد فریم های فایل gif کنترل Timage روی فرم میسازم بعد تصویر هر فرم را لود می کنم و در آخر هم با چنده حلقه می ریزم تو آرایه دو بعدی تا اینجا هیچ مشکلی نیست تا زمانی که می خوام تو فایل باینری ذخیره کنم که نمی دونم کد درست کار می کنه یا نه ؟ مخصوصا خط 32 که نمی دونم باید جای 100 چی بزارم دوستان اگه اطلاعاتی دارن خواهشن دریغ نفرمایید.
procedure TForm1.Button1Click(Sender: TObject);
var
myFile : File;
Count,I,x,y,z:Integer;
gif: TGifImage;
Matrix: array of array of Integer;
begin
if OpenPictureDialog1.Execute then begin
gif := TGifImage.Create;
gif.Loadfromfile(OpenPictureDialog1.FileName);
Count := gif.Images.Count;

for I := 0 to Count-1 do begin
with TImage.Create(Self) do begin
width:=gif.width;
Height:=gif.Height;
Parent:=GroupBox1;
Top:=i*20+20;
Left:= i*130;
Picture.Assign(gif.Images.Frames[I].Bitmap);
end;
end;


for I := 0 to Count-1 do
begin
SetLength(Matrix, gif.Height,gif.width*Count);
for x := 0 to gif.Height-1 do
for y := 0 to gif.width*Count-1 do
Matrix[x,y]:= gif.Images.Frames[I].Bitmap.Canvas.Pixels[X,Y] ;
end;

AssignFile(myFile, 'Test.bin');
ReWrite(myFile);
for x := 0 to gif.Height-1 do
for y := 0 to gif.width*Count-1 do
BlockWrite(myFile, Matrix[x,y],100);
CloseFile(myFile);
end;



end;

Naderenator
شنبه 02 دی 1391, 00:10 صبح
فایل برنامه را هم Up کردم

Felony
یک شنبه 03 دی 1391, 08:10 صبح
هدفت چی هست ؟ که چی پیکسل ها رو میریزی تو یه آرایه ؟ چرا طول آرایه رو تو حلقه تعیین میکنی ؟ میدونی اون کار چقدر سربار داره ؟

اگر هدف ذخیره عکس های Bitmap به صورت پشت هم در یک فایل هست به جای اون جنگولک بازی ها یه ScrollBox بزار روی فرمت و کدت رو به صورت زیر تغییر بده :


var
myFile: TFileStream;
Count, FrameCount: Integer;
gif: TGifImage;
begin
if OpenPictureDialog1.Execute then
begin
gif := TGifImage.Create;
gif.Loadfromfile(OpenPictureDialog1.FileName);
Count := gif.Images.Count;

ScrollBox1.Width := gif.Width + 20;
for FrameCount := 0 to Count - 1 do
begin
with TImage.Create(Self) do
begin
Width := gif.Width;
Height := gif.Height;
Parent := ScrollBox1;
Picture.Assign(gif.Images.Frames[FrameCount].Bitmap);
Align := alTop;
end;
end;

// Write to file
myFile := TFileStream.Create('C:\MyFile.bin', fmCreate + fmOpenWrite);
try
for FrameCount := 0 to gif.Images.Count - 1 do
gif.Images[FrameCount].Bitmap.SaveToStream(myFile);
finally
myFile.Free;
end;
end;
end;

موفق باشید .

Naderenator
دوشنبه 04 دی 1391, 15:28 عصر
منون
اما صورت مساله چیزی دیگه است مساله میگه تک تک پیکسل ها را بعد از نمایش همه فریم ها داخل برنامه که شما لطف کردین کامل اش کردین بریزه تو یک آرایه بعد ذخیره کنه تو فایل باینری .
در مورد تعین طول هم حق با شما اشتباه من بود :گیج:
در ضمن اگر بیشتر از یک فریم داشتیم باید یقیه پیکس ها پشت سر پیکسل های فریم شماره یک در آرایه ذخیره بشه .

Naderenator
دوشنبه 04 دی 1391, 15:46 عصر
قسمت اول مساله حل شد یعنی نمایش و ذخیره پیکس به پیکس در آرایه دو بعدی اگه میشه در مورد قست آخر دخیره در فایل باینری راهنمای فرمایید.
var

Count,I,x,y,z:Integer;
gif: TGifImage;
Matrix: array of array of Integer;
begin

if OpenPictureDialog1.Execute then begin

gif := TGifImage.Create;
gif.Loadfromfile(OpenPictureDialog1.FileName);
Count := gif.Images.Count;
z:=1;
SetLength(Matrix, gif.Height,gif.width*Count);
ScrollBox1.Width := gif.Width + 20;
for I := 0 to Count-1 do
begin
with TImage.Create(Self) do
begin
width:=gif.width;
Height:=gif.Height;
Parent:=ScrollBox1;
Align := alTop;
Picture.Assign(gif.Images.Frames[I].Bitmap);
for x := 0 to gif.Height-1 do
for y := gif.width*I to (gif.width*z)-1 do
Matrix[x,y]:= gif.Images.Frames[I].Bitmap.Canvas.Pixels[X,Y] ;
z:=z+1;
end;
end;

Felony
سه شنبه 05 دی 1391, 08:58 صبح
var
myFile: TFileStream;
Count, FrameCount, XPixels, YPixels: Integer;
gif: TGifImage;
tempBitmap: TBitmap;
Matrix: array of array of Integer;
begin
if OpenPictureDialog1.Execute then
begin
gif := TGifImage.Create;
gif.Loadfromfile(OpenPictureDialog1.FileName);
Count := gif.Images.Count;

ScrollBox1.Width := gif.Width + 20;
for FrameCount := 0 to Count - 1 do
begin
with TImage.Create(Self) do
begin
Width := gif.Width;
Height := gif.Height;
Parent := ScrollBox1;
Picture.Assign(gif.Images.Frames[FrameCount].Bitmap);
Align := alTop;
end;
end;

myFile := TFileStream.Create('C:\MyFile.bin', fmCreate + fmOpenWrite);
try
SetLength(Matrix, gif.Height, gif.Width * Count);
ScrollBox1.Width := gif.Width + 20;
for FrameCount := 0 to Count - 1 do
begin
with TImage.Create(Self) do
begin
Width := gif.Width;
Height := gif.Height;
Parent := ScrollBox1;
Align := alTop;
Picture.Assign(gif.Images.Frames[FrameCount].Bitmap);
for XPixels := 0 to gif.Height - 1 do
for YPixels := gif.Width * FrameCount to (gif.Width * FrameCount) - 1 do
Matrix[XPixels, YPixels] := gif.Images.Frames[FrameCount]
.Bitmap.Canvas.Pixels[XPixels, YPixels];

myFile.WriteBuffer(Matrix, Length(Matrix[0]));
end;
end;
finally
myFile.Free;
end;
end;
end;