PDA

View Full Version : سوال: تبدیل بیت مپ به آیکن 256 رنگ همراه فرانمایی؟



mbshareat
پنج شنبه 17 اسفند 1391, 16:25 عصر
سلام علیکم
من میخوام یه بیت مپ رو تبدیل به آیکنی با لبه شفاف(Transparent) کنم.
یه کدی بدست اوردم و یه کم بهش ور رفتم اما آیکن 16 رنگ درست می کنه.

دو روش برای تبدیل به آیکن دارم کد یکیش رو خودم دستکاری کردم(اسمش رو گذاشتم SetIcon که یه فایل با نام A.Ico میسازه) که آیکن غیر شفاف رو درست ایجاد نمی کنه و در هر صورت آیکن 16 رنگ میسازه و در یه Image نمایش میده.
و یه Function هم دارم (به نام BitmapToIcon که یه فایل با نام B.Ico میسازه)که از اینترنت گرفتم که مشکلش اینه که آیکن رو 16 رنگ میسازه!
این برناممه!:

Ananas
پنج شنبه 17 اسفند 1391, 17:47 عصر
سلام.
101064

mbshareat
پنج شنبه 17 اسفند 1391, 19:27 عصر
سلام
ممنونم.اما من توی یه نسخه قدیمی دلفی تست کردم کلی SetSize رو توی کدتون تبدیل کردم به انتساب طول و عرض. آخرش هم همش AccessViolation میده.
اگه روشش رو توضیح بدید ممنون میشم.
من احتمال میدم این روش توی نسخه دلفی من جواب نده.
کد ساده تر ندارید. من که فرقش رو با کد خودم نفهمیدم.فقط فزقش در تنظیم xHotspot و yHotspot و Transparent رو فهمیدم که امتحان کردم باز آیکن 16 رنگ میسازه!

یوسف زالی
پنج شنبه 17 اسفند 1391, 19:52 عصر
سلام. اگر برنامه آماده به کارتون میاد:
icofxsetup_1.6.3
http://www.icofx.ro/

mbshareat
پنج شنبه 17 اسفند 1391, 20:05 عصر
سلام
نه من میخوام برنامم قابلیت جدیدی پیدا کنه.
محل زندگی شما قبرستون منه!

Ananas
جمعه 18 اسفند 1391, 01:39 صبح
function MakeIcon(
ColorBitm : TBitmap;
MaskBitm : TBitmap;
IconWidth : Integer = 64;
IconHeight : Integer = 64):TIcon;
var
icin: _ICONINFO;
bmask__: TBitmap;
bcolor_: TBitmap;
begin
(*
bmask__ := TBitmap.Create;
bcolor_ := TBitmap.Create;
bmask__.SetSize(IconWidth, IconHeight);
bcolor_.SetSize(IconWidth, IconHeight);

bmask__.Canvas.StretchDraw(rect(0, 0, bmask__.Width, bmask__.Height), maskBitm);
bcolor_.Canvas.StretchDraw(rect(0, 0, bcolor_.Width, bcolor_.Height), colorBitm);
*)

bmask__ := MaskBitm;
bcolor_ := ColorBitm;

icin.fIcon := True;
icin.xHotspot := bcolor_.Width;
icin.yHotspot := bcolor_.Height;
icin.hbmMask := bmask__.Handle;
icin.hbmColor := bcolor_.Handle;

Result := TIcon.Create;
Result.Handle := CreateIconIndirect(icin);
//bmask__.Free;
//bcolor_.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ico : TIcon;
bclr, bmsk, bmskInverte : TBitmap;
dc : HDC;
i, j : Integer;
begin
bmsk := TBitmap.Create;

bmsk.SetSize(64, 64);
//bmsk.Canvas.Brush.Color := $00000000;
//bmsk.Canvas.Ellipse(0, 0, bmsk.Width, bmsk.Height);
bmsk.Canvas.Brush.Style := bsClear;
bmsk.Canvas.Font.Size := 60;
bmsk.Canvas.Font.Style := [fsBold];
bmsk.Canvas.TextOut(-4, -18, 'M');
bmsk.PixelFormat := pf24bit;
//----------------------------------
bclr := TBitmap.Create; bclr.SetSize(bmsk.Width, bmsk.Height);
bclr.PixelFormat := pf24bit;
dc := GetDC(GetDesktopWindow);
BitBlt(bclr.Canvas.Handle, 0, 0, bclr.Width, bclr.Height, dc, 0, 0, SRCCOPY);
ReleaseDC(GetDesktopWindow, dc);
//----------------------------------
bmskInverte := TBitmap.Create;
bmskInverte.SetSize(bmsk.Width, bmsk.Height);
BitBlt(bmskInverte.Canvas.Handle, 0, 0, bmsk.Width, bmsk.Height, bmsk.Canvas.Handle, 0, 0, SRCINVERT);
BitBlt(bclr.Canvas.Handle, 0, 0, bmsk.Width, bmsk.Height, bmskInverte.Canvas.Handle, 0, 0, SRCAND);
//---------------------
ico := MakeIcon(bclr, bmsk, 128, 128);
Self.Canvas.Draw(0, bmsk.Height + 10, bclr);
Self.Canvas.Draw(bmsk.Width, bmsk.Height + 10, bmsk);
Self.Canvas.Draw(bmsk.Width * 2, bmsk.Height + 10, bmskInverte);
Self.Canvas.Draw(0, 0, ico);
Self.Icon := ico;
bclr.Free;
bmsk.Free;
bmskInverte.Free;
ico.Free;
end;

mbshareat
جمعه 18 اسفند 1391, 22:03 عصر
سلام
واقعا ممنونم.اگر درست فهمیده باشم مشکل از وقتی شروع میشه که تصویر رو ذخیره می کنیم.
اگه برنامه من رو ببینید متوجه میشید که در تصویر آیکن 16 نیست؛ اما وقت ذخیره 16 رنگ میشه برنامه شما آیکن رو درست توی برنامه نشون میده اما وقتی ذخیره میشه 16 رنگه! برای اطمینان این کد رو به برنامه تون اضافه کردم :
ico.SaveToFile('C:\A.Ico');
بعد آیکن رو با Axialis Icon Workshop بررسی کردم 16 رنگ گزارش کرد. راهی برای ذخیره صحیح آیکن سراغ ندارید؟

Ananas
جمعه 18 اسفند 1391, 23:15 عصر
منم برای سیوش مشکل داشتم. آیکن های بزرگ تر از 256 در 256 رو درست سیو نمی کرد ولی درست نمایش می داد.

mbshareat
شنبه 19 اسفند 1391, 01:15 صبح
منظورم من تعداد رنگشه.من آیکن بزرگتر از 64 در 64 نمیخوام

Ananas
شنبه 19 اسفند 1391, 09:31 صبح
می دونم ولی راه حلش رو نمی دونم. چیزی که من گفتم ربطی به این نداشت و یک مشکل دیگه ی سیو کردن TIcon دلفی بود.
ولی احتمالا باید از طریق Palette این مشکل رو حل کنید. بالاخره پالت رنگ داره 16 رنگی میشه موقع سیو. البته اگه دلفی به زور موقع سیو خودش تبدیل نکنه.

mbshareat
شنبه 19 اسفند 1391, 10:08 صبح
سلام
من احتمال دادم مشکل از نسخه دلفی باشه رفتم توی ویندوز 7 از دلفی XE2 استفاده کردم آیکن 32 بیت! ذخیره کرده بود برگشتم XP دیدم همه چیز درسته!
تو دلفی نسخه قدیمی برای آیکن یه برنامه تعیین کردم، مشکلی نداشت.
من در هر صورت برنامم رو باید توی دلفی XE2 کامپایل می کردم؛ اما عجیب بود که چطور آیکن تو دلفی قدیمی ترم درست نمایش داده میشد اما درست ذخیره نمیشد!