فرض کنیم P1 و P2 دو تا PictureBox هستند.
زیربرنامه SavePicture
دو تا ورودی داره که اولی تصویره و دومی آدرس فایل. تصویر رو با فرمت Bitmap توی آدرس تعیین شده ذخیره می کنه. بهتره توی آدرس فایل، پسوند رو BMP بدید چون به هر حال فرمت فایل ذخیره شده Bitmap هست و ربطی به پسوند تعیین شده توی آدرس فایل نداره.
کد php:
SavePicture P1.Picture, "C:\Test.bmp"
SavePicture P1.Image, "C:\Test.bmp"
خاصیت Image
این خاصیت رو نمیشه با عملگر مساوی مقدار داد.
کد php:
P1.Image = P2.Image '==> Error
این خاصیت با اِعمال متدهای نقاشی تغییر می کنه:
کد php:
P1.Print "Test"
P1.Line (0, 0)-(150, 150), vbRed
P1.Circle (150, 150), 300, vbBlue
P1.PaintPicture P2.Picture, 0, 0
همینطور هم با تغییر خاصیت Picture تغییر می کنه.
با توابع API گرافیکی هم تغییر میکنه. مثل BitBlt و چندین تابع دیگه.
خاصیت Image فقط قسمت قابل رؤیت PictureBox رو در بر میگیره.
یعنی چی؟
فرض کن P1 با ابعاد 80 پیکسل (X) در 100 پیکسل (Y) باشه و یک خط با مختصات زیر توی P1 رسم کنیم:
کد php:
P1.Line (0, 0)-(150, 150), vbRed
قسمتی از خط که ایکسش (X) بیشتر از 80 و وایش(Y) بیشتر از 100 هست جزو خاصیت Image محسوب نمیشه.
گفتیم که با تغییر خاصیت Picture، خاصیت Image هم تغییر میکنه. فرض کن تصویری با ابعاد 200 پیکسل در 200 پیکسل توی P1 میبذاریم:
کد php:
P1.Picture = LoadPicture("C:\Test.bmp")
ابعاد فایل C:\Test.bmp همونطور که گفتم 200 پیکسل در 200 پیکسل هست ولی خاصیت Image یک محدوده 80 در 100 پیکسلی هست.
خاصیت Picture
این خاصیت رو با عملگر = میشه مقدارش رو تغییر داد:
کد php:
P1.Picture = LoadPicture("C:\Test.bmp")
P1.Picture = P2.Image
P1.Picture = P2.Picture
این خاصیت یه تفاوتی با خاصیت Image داره. اگه یه عکس 200 در 200 توی PictureBox بذاری ولی ابعاد PictureBox اونقدر کوچیک باشه که نتونه همه عکس رو نشون بده باز هم خاصیت Picture شامل تمام عکس میشه در حالیکه خاصیت Image فقط شامل قسمت های قابل مشاهده PictureBox می شد.
خاصیت AutoRedraw
فرامین زیر رو در نظر بگیر:
کد php:
P1.AutoRedraw = False
P1.Line (0,0)-(80,100), vbGreen
P2.Picture = P1.Image
SavePicture P1.Image, "C:\Line.bmp"
خط اول خاصیت AutoRedraw رو برای P1 برابر False قرار داده.
خط دوم خطی از نقطه صفر و صفر به نقطه 80 و 100 رسم کرده توی P1
انتظار میره که توی خط سوم P2 یک خط مثل P1 توش ظاهر بشه و توی خط چهارم عکسی حاوی یک خط تو فایل Line.bmp ذخیره بشه اما
توی خط سوم P2.Picture خالی میشه!
توی خط چهارم فایلی به اسم Line.bmp تو درایو C ذخیره میشه که هیچی توش نیست!
چرا؟
وقتی AutoRedraw یک PictureBox برابر False باشه مقدار Image اون از بین میره. برای اینکه این اتفاق نیافته باید AutoRedraw رو True کنیم:
اگه فرمان بالا رو بجای خط اول جایگزین کنیم، خط سوم و چهارم طبق انتظار ما عمل میکنن.
خاصیت ScaleMode
این خاصیت واحد اندازه گیری رو تعیین می کنه که بطور پیشفرض Twip هست. بهتره با Pixel کار کنیم چرا؟
ما با مانیتور سر و کار داریم و کوچکترین واحد تو مانیتور پیکسله. تا وقتی که اندازه چیزی رو یک پیکسل کم یا زیاد نکنید، تغییری مشاهده نمیشه. پس برای خودتون بصورت یک عادت در بیارین که همیشه خاصیت ScaleMode رو هم برای Form و هم برای PictureBox ها به مقدار vbPixels تغییر بدین.
زیربرنامه PiantPicture
کد php:
P1.PaintPicture Picture, X1, Y1, Width1, Height1, X2, Y2, Width2, Height2
Picture یک عکسه مثلا P1.Picture یا P1.Image یا خروجی تابع LoadPicture()
X1 و Y1 نقطه شروع نقاشی روی PictureBox موردنظر (در اینجا P1) هستند
Width1 و Height1 طول عرضی هستند که برای رسم عکس توی P1 تعیین میشه. یعنی عکس به این اندازه کش میاد.
X2 و Y2 نقطه شروع کپی برداری از Picture
Width2 و Height2 طول و عرض قسمتی از Picture که باید توی P1 رسم بشه.
از X1, Y1, Width1, Height1 برای Stretch کردن و از X2, Y2, Width2, Height2 برای Crop کردن میشه استفاده کرد.
Height و ScaleHeight
یک فرم رو در نظر بگیر. از بالا نوار عنوان رو داری در پایین یک لبه برای تغییر اندازه فرم و وسط هم محدوده ای برای قرار دادن اشیا که زمان طراحی Object ها رو توش قرار میدیم. این سه قسمت روی هم میشن Height اما ScaleHeight فقط شامل محدوده ای میشه که توسط شما قابل استفاده هست و Object ها رو توش میذارین.
حالا فرض کن برای فرمت یک منو هم طراحی کردی. نوار منو قسمتی از ارتفاع فرم رو اشغال می کنه. نوار منو هم جزو Height محسوب میشه و ScaleHeight همچنان همون قسمتیه که شما میتونی توش Object بذاری.
Width و ScaleWidth
یک فرم از سمت راست و از سمت چپ لبه هایی داره که با کشیدن اونا اندازه فرم رو تغییر میدی به اضافه قسمت وسط که فضایی برای قرار دادن Object هاست. عرض اون قسمت وسط میشه ScaleWidth و عرض کل فرم شامل قسمت وسط و لبه های سمت چپ و سمت راست میشه Width
PictureBox ها همینطور هستند. از سمت چپ و راست و بالا و پایین لبه هایی دارند که قابل استفاده نیستند و فقط برای قشنگی هستند. شما میتونی شکل این لبه ها رو با استفاده از خواص BorderStyle و Appearance تغییر بدی.
تو این مثال میخوایم از تمام فضای PictureBox برای رسم یک عکس استفاده کنیم.
کد php:
P1.Picture = LoadPicture("C:\Test.bmp")
P2.PaintPicture P1.Picture, 0, 0, P2.ScaleWidth, P2.ScaleHeight
تصویر موجود در P1 توی P2 رسم میشه. جالبه که به اندازه P2 کش میاد و مثل Stretch کردن می مونه. معادل فرمان بالا رو به یک شکل دیگه هم میشه نوشت:
کد php:
P2.PaintPicture LoadPicture("C:\Test.bmp"), 0, 0, P2.ScaleWidth, P2.ScaleHeight
جالبه! نه؟
وقتی میخوای یه تیکه از یک تصویر رو برش بدی و توی یک PictureBox دیگه کپی کنی باید از X2, Y2, Width2, Height2 هم استفاده کنی و بهشون مقدار بدی.
فرض کن توی P1 عکسی هست که میخوایم از موقعیت 100, 100 برشی با ابعاد 45 در 90 جدا کنیم و توی P2 رسم کنیم.
تو مثال اول این برش رو به اندازه ابعاد P2 کش میاریم:
کد php:
P2.PaintPicture P1.Picture, 0, 0, P2.ScaleWidth, P2.ScaleHeight, 100, 100, 45, 90
تو مثال دوم این برش رو با همون ابعاد خودش یعنی 45 در 90 رسم می کنیم:
کد php:
P2.PaintPicture P1.Picture, 0, 0, 45, 90, 100, 100, 45, 90
آموزش تصویری خیلی مؤثرتر از آموزش متنیه ولی آموزش عملی از اون هم مؤثرتره. چون آپلود عکس طول میکشه و به صرفه نیست آموزش متنی گذاشتم برات. بهتره که کار با این خواص و زیربرنامه ها و توابع رو خودت عملی کار کنی.
جناب davoodx
یه عکس به اسم Test.bmp بذار توی درایو C
یه PictureBox به اسم P1 و چهار تا دکمه هم بذار روی فرم
بگو که هرکدوم از دکمه های زیر چیکار می کنند و چه نتیجه ای میشه ازشون گرفتن؟
کد php:
Private Sub Command1_Click()
P1.AutoRedraw = False
P1.Line (0, 0)-(P1.ScaleWidth, P1.ScaleHeight)
P1.Picture = P1.Image
P1.Cls
End Sub
Private Sub Command2_Click()
P1.AutoRedraw = True
P1.Line (0, 0)-(P1.ScaleWidth, P1.ScaleHeight)
P1.Picture = P1.Image
P1.Cls
End Sub
Private Sub Command3_Click()
P1.AutoRedraw = False
P1.Picture = LoadPicture("C:\Test.bmp")
P1.Cls
End Sub
Private Sub Command4_Click()
P1.AutoRedraw = True
P1.PaintPicture LoadPicture("C:\Test.bmp"), 0, 0
P1.Picture = P1.Image
P1.Cls
End Sub