PDA

View Full Version : سوال: transparent كردن picturebox



mahboube
چهارشنبه 28 مهر 1389, 16:27 عصر
سلام دوستان
چطوري ميشه يك picturebox روtransparent كرد طوري كه كنترل هاي زيريش هم نمايش داده بشه؟

mahboube
پنج شنبه 29 مهر 1389, 10:29 صبح
كسي نمي دونه چطوري ميشه اينكارو كرد؟
دوتا picturebox دارم مي خوام رويي رو شفاف كنم كه زيريش هم نشون داده بشه؟
ميشه؟؟!!

Saman_12
پنج شنبه 29 مهر 1389, 12:32 عصر
توی تایپیک زیر یک Dll آپلود کردم که یکی از ابجکت هاش (PictureBox) هست طریقه استفاده و بقیه موارد هم ذکر شده :
دانلود : یک Dll و سه آبجکت شیشه ای! (http://www.barnamenevis.org/forum/showthread.php?p=1103817#post1103817)

mahboube
پنج شنبه 29 مهر 1389, 13:09 عصر
توی تایپیک زیر یک Dll آپلود کردم که یکی از ابجکت هاش (PictureBox) هست طریقه استفاده و بقیه موارد هم ذکر شده :
دانلود : یک Dll و سه آبجکت شیشه ای! (http://www.barnamenevis.org/forum/showthread.php?p=1103817#post1103817)

خيلي خيلي ممنون.ولي يا من نتونستم يا نشد كاري كه ميخام بكنم.
من ميخام تصوير رويي شفاف بشه و تصويري كه تو picturebox زير هست هم نشون داده بشه.
بزرنامه رو ميزارم كه از dll هاي خودتون استفاده شده.
خيلي ممنون ميشم اگر راهنمايي كني.:قلب:

Saman_12
پنج شنبه 29 مهر 1389, 16:05 عصر
یک ویرایش کوچیک کردم ببینید همین مد نظرتون هست :

bade saba
شنبه 01 آبان 1389, 03:08 صبح
توی تایپیک زیر یک Dll آپلود کردم که یکی از ابجکت هاش (PictureBox) هست طریقه استفاده و بقیه موارد هم ذکر شده :
دانلود : یک Dll و سه آبجکت شیشه ای! (http://www.barnamenevis.org/forum/showthread.php?p=1103817#post1103817)


با تشکر به خاطر این dll مفیدی که معرفی کردید اما دوست عزیز من یه مشکل در استفاده از این ابزار دارم
pictureBox موجود اگر بر روی tabContol از سری dotNetBar8 استفاده بشه مثل زربین کار میکنه و عکس زیری رو بزرگتر نشون میده و همچنین بخش دیگه ای از عکس زیری رو نشون میده نه قسمت زیر pictureBox رو میخواستم راهنماییم کنی که چه جوری باد این مشکل رو حل بکنم

البته روی tabControl های خود VS هم همین مشکل رو بر میخوریم و فکر نمیکنم به dotNetBar8 مربوط باشه

ممنون

cardano7
شنبه 01 آبان 1389, 03:38 صبح
سلام
pictureBox ذاتا Transparent هست.
مشکل اینجاست که عکس شما Transparent نیست.

mahboube
شنبه 01 آبان 1389, 09:54 صبح
یک ویرایش کوچیک کردم ببینید همین مد نظرتون هست :

مرسي.دقيقا همينه.فقط اگر عكسها روي هم فيت نباشن چشمك ميزنه كه من تايمرو برداشتم.
خيلي كمك كردي.مرسييييي .:لبخندساده:

پ.و.تولدت هم مبارك.:قلب::لبخند:

mahboube
شنبه 01 آبان 1389, 13:36 عصر
یک ویرایش کوچیک کردم ببینید همین مد نظرتون هست :

اين برنامت خيلي خوبه ولي يك ايراد بزرگ داره اونم وقتيه كه عكسا بزرگ باشن زماني كه تو for دوباره رسمشون مي كني خيلي طول ميكشه و مخصوصا اگر اگر تعداد عكسا زياد باشه!مثلا من 40تا picturebox دارم!كه تازه تو يه حلقه عكسشون عوض ميشه.يه جورايي براي من غير ممكنه ازش استفاده كنم .راهي نداره؟؟!!

ممنون ميشم اگر كسي كامپوننت يا راه ديگه اي هم كمك كنه.
مرسي.

bade saba
شنبه 01 آبان 1389, 21:56 عصر
سلام
pictureBox ذاتا Transparent هست.
مشکل اینجاست که عکس شما Transparent نیست.


دوست عزیز عکس های من transparent است اما عکس زیری مشخص نمیشه امتحان کن و اگه موفق شدی عکس زیری رو نمایش بدی ممنون میشم برنامرو برام بزاری تا ببینم

MoS4k1
یک شنبه 02 آبان 1389, 00:12 صبح
دوست عزیز بهترین کار اینه که از wpf استفاده کنی

cardano7
یک شنبه 02 آبان 1389, 03:18 صبح
دوست عزیز عکس های من transparent است اما عکس زیری مشخص نمیشه امتحان کن و اگه موفق شدی عکس زیری رو نمایش بدی ممنون میشم برنامرو برام بزاری تا ببینم

اون فایلی که در مثال گذاشته بودید زمینه ش خاکستری بود نه Transparent.
میشه یک نمونه از عکس های با زمینه ی شفافتون رو اینجا قرار بدید؟

bade saba
یک شنبه 02 آبان 1389, 10:50 صبح
اون فایلی که در مثال گذاشته بودید زمینه ش خاکستری بود نه Transparent.
میشه یک نمونه از عکس های با زمینه ی شفافتون رو اینجا قرار بدید؟


اون فایل برای دوستمون بود شما هر فایل transparent ای استفاده کردی مهم نیست.
شما یک بار بدون عکس امتحان کن ببین پشتش دیده میشه؟؟؟ بعد عکس transparent هم تو یه pictureBox دیگه امتحان کن

Saman_12
یک شنبه 02 آبان 1389, 19:00 عصر
می بخشید من دیر به دیر میتونم به سایت سر بزنم فشردگی درس هام نمی زاره قبل از ساعت 18_19 بیام توی سایت!

من تک به تک به سوال ها تون جواب میدم :

با تشکر به خاطر این dll مفیدی که معرفی کردید اما دوست عزیز من یه مشکل در استفاده از این ابزار دارم
pictureBox موجود اگر بر روی tabContol از سری dotNetBar8 استفاده بشه مثل زربین کار میکنه و عکس زیری رو بزرگتر نشون میده و همچنین بخش دیگه ای از عکس زیری رو نشون میده نه قسمت زیر pictureBox رو میخواستم راهنماییم کنی که چه جوری باد این مشکل رو حل بکنم

البته روی tabControl های خود VS هم همین مشکل رو بر میخوریم و فکر نمیکنم به dotNetBar8 مربوط باشه

ممنون
مشکل از کامپونت های خود VS نیست بلکه مشکل از طریقه ای هست که کامپونت های من خودشون رو شفاف میکنند این کامپونت اول یک عکس از تمام فرم میگرند بعد یک لایه از رنگ شفاف روی اون می کشند بعد هم عکس رو به عنوان پس زمینه کامپونت تعریف می کنند.
سعی میکنم در اولین فرستی که بدست آوردم ویرایششون کنم تا کمی دقیق تر بشند.


مرسي.دقيقا همينه.فقط اگر عكسها روي هم فيت نباشن چشمك ميزنه كه من تايمرو برداشتم.
بله این یکی از باگ های این کامپونت محسوب میشه!(بعید میدونم بتون درستش بکنم!)


اين برنامت خيلي خوبه ولي يك ايراد بزرگ داره اونم وقتيه كه عكسا بزرگ باشن زماني كه تو for دوباره رسمشون مي كني خيلي طول ميكشه و مخصوصا اگر اگر تعداد عكسا زياد باشه!مثلا من 40تا picturebox دارم!كه تازه تو يه حلقه عكسشون عوض ميشه.يه جورايي براي من غير ممكنه ازش استفاده كنم .راهي نداره؟؟!!

خوب شما باید از عکس های transparent به عنوان تصویر استفاده کنید نه اینکه توی برنامه خودتون اون تصویر رو به این شکل در بیارید!(وقتی عکسی کاملا رنگی هست یعنی transparent شده نیست چطور میشه پشتش معلوم باشه!)
شما دو راه دارید :
1.عکس رو توصت برنامه خودتون transparent کنید.
2.عکس باید از قبل transparent باشه.


دوست عزیز بهترین کار اینه که از wpf استفاده کنی
کلا فناوری Wpf برای همین کار طراحی شده اما متاسفانه من بلد نیستم باهاش کار کنم.

mohamad.alijani
یک شنبه 02 آبان 1389, 20:09 عصر
من فكر مي كنم مشكل شما اينقدر هم حاد نيست فقط كافيه كه عكس مورد نظرتون رو توي يك ويرايشگر تصوير مثلا فتوشاپ بصورت transparent در بياريد و با فرمت png و يا gif ذخيره كنيد و توي pictureBox ازش استفاده كنيد
موفق باشيد.

bade saba
یک شنبه 02 آبان 1389, 20:48 عصر
من فكر مي كنم مشكل شما اينقدر هم حاد نيست فقط كافيه كه عكس مورد نظرتون رو توي يك ويرايشگر تصوير مثلا فتوشاپ بصورت transparent در بياريد و با فرمت png و يا gif ذخيره كنيد و توي pictureBox ازش استفاده كنيد
موفق باشيد.


دوست عزیز این موضوع رو دوستمون cardano7 (http://www.barnamenevis.org/forum/member.php?u=145181) هم مطرح کردن اما این کار رو من موفق به انجامش نشدم ممنون میشم یک نمونه درست کنید و اینجا قرار بدید ، ببینید اصلا امکان داره کاری بکنید که یه pictureBox خالی عکس پشت سرش رو نشون بده تا بعد به عکس transparent برسیم

mohamad.alijani
یک شنبه 02 آبان 1389, 21:57 عصر
ببينيد
وقتي كه يك PictureBox به صورت ،transparent در مياد يعني نسبت به فرم اين خاصيت رو داره
و اگر كنترلي پشت سرش قرار بگيره اون رو نشون نميده شما براي فرمتون يك بگ گراند بذاريد و بعد هم از يك PictureBox كه اين خاصيت رو داره استفاده كنيد مي بينيد كه نسبت به عكس پس زمينه فرمتون شفاف هست.
حالا اگر بخواهيد كه كنترل هاي پشت سر اون هم ديده بشه نمي دونم مي شه يانه بايد امتحان كرد

Saman_12
یک شنبه 02 آبان 1389, 22:16 عصر
این بدون تصویرش :
http://italia-host.coolpage.biz/uploads/1287963229.jpg

Saman_12
یک شنبه 02 آبان 1389, 22:37 عصر
اگه شما میخواهید تنها تصویر فرم که زیر پیکچر هست رو ببینید این ساده ترین روشه :

PictureBox1.BackColor = Color.FromArgb(127, Color.White);

bade saba
یک شنبه 02 آبان 1389, 23:03 عصر
اگه شما میخواهید تنها تصویر فرم که زیر پیکچر هست رو ببینید این ساده ترین روشه :

PictureBox1.BackColor = Color.FromArgb(127, Color.White);


من این کد رو استفاده کردم اما هیچ تغییری پیش نیومد:ناراحت:

cardano7
دوشنبه 03 آبان 1389, 04:51 صبح
اگه شما میخواهید تنها تصویر فرم که زیر پیکچر هست رو ببینید این ساده ترین روشه :

PictureBox1.BackColor = Color.FromArgb(127, Color.White);

یادم نیست. فکر کنم فرمولش این بود:

PictureBox1.BackColor = Color.FromArgb(0, Color.Black);

mahboube
دوشنبه 03 آبان 1389, 08:59 صبح
خب نازنين دوستان
من از همتون سپاسگذارم ولي من دارم از فرمم توي برنامه با تابعBITBlT عكس مي گيرم
پس:
1-برام امكان نداره از فتوشاپ استفاده كنم يا بi عبارتي از اول عكس ترنسپرنت بيارم
2-اگه عكسي كه دارم ميگيرم رو اول با تابعي شبيه AlphaBlend شفاف كنم(alpha شو تغيير بدم) و بعد توي اين pictureBox ها بزارمش مشكلم حله يعني؟؟!!!
3-من نميتونم از اين تابع (كه خودتون گذاشتين تو برنامه)استفاده كنم چون سرعتمو داغون ميكنه:



privatevoid SetAlpha(Glassy.GlassyPictureBox picbox)
{
Bitmap GPBI = newBitmap(picbox.Image);
Bitmap NewBmp = newBitmap(GPBI.Width, GPBI.Height);
Color OldColor;
for (int X = 0; X < GPBI.Width; X++)
{
for (int Y = 0; Y < GPBI.Height; Y++)
{
Application.DoEvents();
OldColor = GPBI.GetPixel(X, Y);
NewBmp.SetPixel(X, Y, Color.FromArgb(200, OldColor));
}
}
picbox.Image = NewBmp;
GPBI.Dispose();
picbox.BackgroundImage = picbox.GetLucid(this.BackColor, this.BackColor, 0, 0);
}



4-اين تابع setAlpha س كه شايد كسي بخواد استفاده كنه:(برنامه مشو گذاشتم!)به نظرتون مي تونم از اين تابع استفاده كنم عكسو شفاف كنم به بزارم توي اين كنترل و زيريشو نشون بده؟؟


نكته:اين تابع در واقع مي تونه دوتا عكسو تركيب كنه و توي يك picturebox نشون بده.(يا يه عكسو alpha شو ست كنه).
آقا فقط جان نازنينتون F1!:لبخند:

MEhdi Sobhani
دوشنبه 03 آبان 1389, 09:47 صبح
این یه کنترل درست میکنه واسه نمایش عکس شفاف ولی یه مقدار مشکلات داره :



public class TransparentControl : Control
{
private readonly Timer refresher;
private Image _image;

public TransparentControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColo r, true);
BackColor = Color.Transparent;
refresher = new Timer();
refresher.Tick += TimerOnTick;
refresher.Interval = 50;
refresher.Enabled = true;
refresher.Start();
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}

protected override void OnMove(EventArgs e)
{
RecreateHandle();
}


protected override void OnPaint(PaintEventArgs e)
{
if (_image != null)
{
e.Graphics.DrawImage(_image, 0, 0);

}
}

protected override void OnPaintBackground(PaintEventArgs e)
{
//Do not paint background
}

//Hack
public void Redraw()
{
RecreateHandle();
}

private void TimerOnTick(object source, EventArgs e)
{
RecreateHandle();
refresher.Stop();
}

public Image Image
{
get
{
return _image;
}
set
{
_image = value;
RecreateHandle();
}
}
}

mahboube
دوشنبه 03 آبان 1389, 12:57 عصر
راه ديگه اي نداره!!؟؟؟
خيلي واجبه ها!
مثلا كامپوننتي شبيه همين گلاسي ولي با سرعت بهتر؟!!

Saman_12
دوشنبه 03 آبان 1389, 14:38 عصر
یادم نیست. فکر کنم فرمولش این بود:

PictureBox1.BackColor = Color.FromArgb(0, Color.Black);

این کد فورملی نیست بلکه :
عدد 0 میزان شفافیت رو تایین میکنه که 255 کاملا کرد و 0 کاملا شفاف است.
رنگ Black هم رنگیه که به عنوان رنگ اصلی که قراره شفاف بشه تایین میشه!

پس نتیجه این شد که کد من تنها رنگ سفید رو به طور نیمه شفاف در میاره و کد شما رنگ سیاه رو به طور کاملا شفاف.(اصلا رنگ سیاهی در کار نیست رنگ کاملا محو میشه.)

syntiberium
دوشنبه 03 آبان 1389, 17:40 عصر
من یه نمونه بازی شطرنج نوشتم که 32 تا picturebox می سازه و بر اساس فایل png شفافشون می کنه . ببین به دردت می خوره یا نه :
http://barnamenevis.org/forum/showpost.php?p=1126975&postcount=604

mahboube
سه شنبه 04 آبان 1389, 10:38 صبح
تو سايت c_sharpcorner يكي از دوستان گفته اينكارو كنم:يعني ميشه panel رو ترنسپرنت كني.ولي من نتونستم اون چيزي كه مي خوام درس كنم.شايدم نفهميدم دقيقاچي كار كنم.ممنون ميشم اگر كسي بتونه انجامش بده.به مام بگه:


it's pretty easy to just use a panel, set the background to transparent, then use GDI+ to draw your image yourself by overriding the OnPaint method.

mahboube
سه شنبه 04 آبان 1389, 13:31 عصر
دوست عزیز بهترین کار اینه که از wpf استفاده کنی

چطوري ميتونم ازwpf استفاده كنم؟بايد usercontrol ي درست كنم كه عكسو transaprent نشون بده؟؟
چون بايد حتماتوwinapp ازش استفاده كنم.
ممنون.

مهدی فرزاد
سه شنبه 04 آبان 1389, 13:57 عصر
سلام
توي WPF كنترل Image براي نمايش عكس هست
كافيه اين كنترل رو به برنامه اضافه كني بعد Opacity كنترل رو كم كني مثلا 50%
حالا هر عكسي كه توش بگذاري پشتش معلوم ميشه و transparent هست


<Image x:Name="image" Height="88" Margin="199,105,300,0" VerticalAlignment="Top" Opacity="0.5"/>
براي استفاد در WINapp
كافيه در WPF يك يوزر كنترل درست كنيد كه اين كنترل Image در مركزش باشه
و Opacity اون 50% و اونو توي برنامه winapp استفاده كني
اما نميدونم اين خاصيتش توي WINApp هم جواب ميده يا نه تست كنيد

MEhdi Sobhani
سه شنبه 04 آبان 1389, 15:15 عصر
تو سايت c_sharpcorner يكي از دوستان گفته اينكارو كنم:يعني ميشه panel رو ترنسپرنت كني.ولي من نتونستم اون چيزي كه مي خوام درس كنم.شايدم نفهميدم دقيقاچي كار كنم.ممنون ميشم اگر كسي بتونه انجامش بده.به مام بگه:


it's pretty easy to just use a panel, set the background to transparent, then use GDI+ to draw your image yourself by overriding the OnPaint method.

اون منظورش همون کاری هست که تو سورس برنامه دو سه تا پست بالاتر انجام دادم .
مشکل اینجاست که باید فرم رو ریفرش کرد و هر بار که ریفرش کنی تو صفحه یه مقدار پرش ایجاد میشه .

mahboube
سه شنبه 04 آبان 1389, 15:25 عصر
فكر ميكنم راه ساده ترش استفاده از كنترل image ،wpf باشه.
كه البته هر چندتا image كه قراره روي هم transparent بشن بايد توي كنترل wpf قرار بگيره.

cardano7
چهارشنبه 05 آبان 1389, 11:21 صبح
دوست عزیز بهترین کار اینه که از wpf استفاده کنی

wpf خودش یک پروژه ست.
اون هم آخرش همین نتیجه رو میده(البته بعد کلی لقمه دور سر پیچوندن)

Mafia_ir
یک شنبه 17 مهر 1390, 15:56 عصر
سلام

من یک عکس ترنسپرنت شده با فوتوشاپ دارم ولی نمیخوام که فقط عکس به پس زمینه شفاف باشه ، می خوام عکس زیرش هم معلوم بشه . راستی من در مورد WPF من اطلاعی ندارم . چی کار کنم ؟