سلام.
داستان:
----------
تا حالا شده بخواهید بصورت ران تایم یک عکس درست کنید که توش تصویر هم داشته باشه؟ بعد مجبور بشید از فایل استفاده کنید؟
تا حالا شده برای کامپوننت هاتون احتیاج به آیکون داشته باشید ولی مجبور بشید از ریسورس استفاده کنید؟
تا حالا شده که یک فایل رو دوست داشته باشید در "متن یونیت برنامه" داشته باشید نه در فرم؟
همیشه به خودم می گفتم چه خوب بود که یک رشته از باینری (کد هگز شده) رو به یک تابع بدم و اون بهم اصل فایل رو بده. تا این که امروز دیگه تصمیم گرفتم بنویسمش.
این تابع ورودی رشته می گیره و خروجی یک استریم می ده که می تونید هر استفاده ای ازش کنید.
مثال زیر به همراه متن تابع، رشته ای رو به عکس تبدیل می کنه.
نکته: این رشته رو از اینجا آوردم:
1- یک عکس رو فرم گذاشتم
2- تصویرش رو از روی یک فایل لود کردم و اتو سایز کردم
3- راست کلیک رو فرم
4- View as Text
5- Picture.Data رو کپی کردم !!
6- 24 تای اولش رو (Header) پاک کردم
7- تبدیل به رشته کردم
8- عکس رو پاک کردم
روش آسون تری هم براش هست که ران تایم اجرا می شه. فایل رو SaveToStream می کنید، بعد تبدیل به هگز می کنید.
اما کد:
procedure HexToStream(HexStr: string; Stream: TStream);
var
Buffer: PChar;
BufSize: Integer;
begin
if not Assigned(Stream) then
Exit;
if Odd(length(HexStr)) then
Exit;
BufSize := Length(HexStr) div 2;
Buffer := AllocMem(BufSize);
try
HexToBin(PChar(HexStr), Buffer, BufSize);
Stream.Write(Buffer[0], BufSize);
Stream.Position := 0;
finally
FreeMem(Buffer);
end;
end;
و البته مثال:
procedure TForm1.Button1Click(Sender: TObject);
var
s: TMemoryStream;
begin
s := TMemoryStream.Create;
HexToStream(
'424D1E0400000000000076000000280000002900' +
'0000270000000100040000000000A8030000232E0000232E0 000100000000000' +
'0000000000000000800000800000008080008000000080008 000808000008080' +
'8000C0C0C0000000FF0000FF000000FFFF00FF000000FF00F F00FFFF0000FFFF' +
'FF00FFFFF778833378778778877888738FFF878FFFFFF0000 000FFFFFF187331' +
'87777778777787788F878FFFFFFFF0000000FFFFFFF03B378 77777778877838F' +
'FF88FFFFFFFFF0000000FFFFFFF83B18777777877778188FF F7FFFFFFFFFF000' +
'0000FFFFFFF7837877777871117578FFFF88FFFFFFFFF0000 000FFFFFF838308' +
'7778885115578FFFFFF7FFFFFFFFF000000087FFFF3B38808 787757771788FFF' +
'FFF87FFFFFFFF0000000FF8FF8387FF8171788733788FFFFF FFFF778FFFFF000' +
'0000FF8FF3838FFF888888378FFFFFFFFFFFFFF877FFF0000 000F88F73B7FFFF' +
'FFF78777FFFFFFFFFFFFFFFFFF78F000000087FF383FFFFFF FF78878FFFFFFFF' +
'FFFFFFFFFFF7F00000008FF7B87FFFFFFFF88788FF7777778 FFFFFFFFFF7F000' +
'0000FFF3B3FFFFFFFFF88877778FFFFF778FFFFFFF88F0000 000FF7B87FFFFFF' +
'FFF78378888333338F78FFF8778FF000000078383FFFFFFFF F83788313788888' +
'88F77778FFFFF000000083837FFFFFFFF7788317FF8883777 8837FFFFFFFF000' +
'000083B3FFFFFFF8788717F888838FFFF7787FFFFFFFF0000 0003838FFFFFF77' +
'8817F8888887FFFFFF3F7FFFFFFFF0000000383FFFFFF8788 1888887887FFFFF' +
'FF837FFFFFFFF0000000838FFFFFF7F81888788788F8FFFFF FF7378FFFFFF000' +
'0000B7FFFFFF7FF3788887388718FFFFFFF77F8777FFF0000 00038FFFFFF7F83' +
'F88888F88708FFFFFFF77FFFF87FF000000078FFFFF88F388 88888800F70FFFF' +
'FFF77FFFFFF7F000000088FFFFF7FF3F88377882088807FFF F878FFFFFF8F000' +
'0000FF7FFFF7F878838FFFF877F888777787FFFFFFFF80000 000FF87FFF8F788' +
'87FFFFFFF08888888887FFFFFFFF70000000FFFF8877FF888 8FFFFF8F7788888' +
'887FFFFFFFFF80000000FFFFFFF8788887FFFFF8F77888888 87FFFFFFFFF8000' +
'0000FFFFFFFF77F887FFFFFFF388888787FFFFFFFFFF70000 000FFFFFFFF83F8' +
'888FFFFF838888880FFFFFFFFFF880000000FFFFFFFFF77F8 878FFFF38888877' +
'88FFFFFFFFF7F0000000FFFFFFFFF887F887788788888F77F 78FFFFFFF8FF000' +
'0000FFFFFFFFF8FF78888888777F8387FF87888877FFF0000 000FFFFFFFFF8FF' +
'F8778887F8737FF7FFFF8778FFFFF0000000FFFFFFFFF8FFF FFF87377888773F' +
'FFFFFFFFFFFFF0000000FFFFFFFFF8FFFFFFFF7FFFFFFFFFF FFFFFFFFFFFF000' +
'000038FFFFFFF8FFFFFFF7FFFFFFFFFFFFFFFFFFFFFFF0000 000B33FFFFFFF7F' +
'FFFF88FFFFFFFFFFFFFFFFFFFFFFF0000000BB337FFFFFF77 8778FFFFFFFFFFF' +
'FFFFFFFFFFFFF0000000'
, s);
Image1.Picture.Bitmap.LoadFromStream(s);
s.Free;
end;
بین رشته هیچ فاصله ای نیست و ممکنه ویرایش گر سایت وسطش فاصله بندازه که ریپلیس می کنید دیگه!
امیدوارم که لذت ببرید.