ايران ويج

نسخه‌ی کامل: برنامه برای تابلو روان(تبدیل عکس به پیکسل) یا تبدیل متن به پیکسل
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4
سلام
من به یه برنامه احتیاج دارم که عکس سیاه و سفید( به اندازه 32*64) رو به پیکسل تبدیل کنه تا بتونم بفهمم کدوم نقاط روشن و خاموش هستن
یا
چه طور می شه یه متن گرفته شده رو یه این عکس تبدیل کرد.

[تصویر:  2s6rqja.gif]

ممنون
کسی الگویی نداره چه طور متن و به پیکسل تبدیل کنم
خيلي ساده بود کدنويسيش.
خوراکش فونت با سايز بزرگه و مرگش توي کار با سازهاي کوچيکه.
البته اگه طول و عرض پيکسل ها رو هم کم کني کيفيت خيلي بالا ميره ولي کمتر از 4 نمي تونن باشن.
بعضي جاهاي کد از H-1 يا W-1 استفاده کردم. براي منطبق شدن لبه Shpae ها رو هم ديگه اين کار رو کردم در غير اينصورت لبه هاشون کنار هم قرار مي گرفتند نه روي هم.
عکس اول سايز فونتش 72 هستش (خيلي کوچيکه) ولي چون پيکسل هاش 4 در 4 هستند خوب اومده.
عکس دوم پيکسل هاش 7 در 7 هستند ولي چون سايز فونتش 120 هستش (خيلي بزرگ) بازم جبران شده و خوب اومده.

[تصویر:  315zork.jpg]
سلام مجتبي جون

آقا تو كه كارت عالي بود يه مردونگي كن اين برنامه رو توضيح بده
مثلا اين get pixel چه كار مي كنه
اگه خط به خط باشه كه عاليه(شرمنده)

Option Explicit

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long

Private Sub Command1_Click()
Dim X As Integer, Y As Integer, Index As Integer
Dim Blank As Long
Picture1.Cls
Blank = GetPixel(Picture1.hdc, 0, 0)
Picture1.CurrentX = (Picture1.ScaleWidth - Picture1.TextWidth(Text1)) \ 2
Picture1.CurrentY = (Picture1.ScaleHeight - Picture1.TextHeight(Text1)) \ 2
Picture1.Print Text1
For Index = 1 To shp.UBound
X = shp(Index).Left + shp(Index).Width \ 2
Y = shp(Index).Top + shp(Index).Height \ 2
If GetPixel(Picture1.hdc, X, Y) <> Blank Then
shp(Index).FillColor = vbRed
Else
shp(Index).FillColor = Blank
End If
Next
Picture1.Cls
End Sub

Private Sub Form_Load()
Dim Row As Long, Col As Long
Dim vLeft As Integer, vTop As Integer
Dim Cols As Long, Rows As Long
Dim Index As Long
Const W = 7
Const H = 7
Picture1.ScaleMode = vbPixels
Picture1.AutoRedraw = True
Rows = Picture1.ScaleHeight \ (H - 1)
Cols = Picture1.ScaleWidth \ (W - 1)
shp(0).Visible = False
shp(0).FillStyle = 0
vLeft = 0
vTop = 0
For Row = 1 To Rows
For Col = 1 To Cols
Index = (Row - 1) * Cols + Col
Load shp(Index)
shp(Index).Move vLeft, vTop, W, H
shp(Index).Visible = True
vLeft = vLeft + W - 1
Next
vLeft = 0
vTop = vTop + H - 1
Next
End Sub
GetPixel اسمش معلومه. رنگ یک نقطه از یک بستر رو برمیگردونه.
بستر به زبون ساده صفحه ای هست که توش نقاشی می کنیم. منظور از نقاشی کشیدن اشکال هندسی، رسم تصویر، رنگ کردن و ...
مختصات اون نقطه از بستر هم با پارامتر دوم و سوم مشخص میشن.
فرض کن روی یه صفحه یه متن نوشتی.
کد:
Picture1.Print Text1
برای اینکه متنت وسط صفحه ظاهر بشه این کار رو می کنی:
کد:
Picture1.CurrentX = (Picture1.ScaleWidth - Picture1.TextWidth(Text1)) \ 2    Picture1.CurrentY = (Picture1.ScaleHeight - Picture1.TextHeight(Text1)) \ 2
صفحه رو با تعدادی سکه فرش می کنی.
کد:
Form_Load
تک تک سکه ها رو باید کنترل کنی.
کد:
For Index = 1 To shp.UBound
هر سکه ای که رو که برداشتی و دیدی که زیرش رنگیه اون سکه رو میذاری سر جاش بمونه ولی هر سکه ای که زیرش رنگی نبود اونو دور میندازی. ما بجای دورانداختن سکه ها اونا رو با رنگ زمینه صفحه (Blank) محو می کنیم. و سکه هایی رو هم که باید بمونن با یه رنگ دیگه مثلا قرمز (vbRed) مشخص می کنیم.
کد:
If GetPixel(Picture1.hdc, X, Y) <> Blank Then
        shp(Index).FillColor = vbRed
Else
        shp(Index).FillColor = Blank
End If
حالا از کجا بفهمیم زیر سکه رنگ خورده یا نه؟
زمانی که صفحت خالیه (Picture1.Cls) ببین یه نقطه از صفحه چه رنگه؟ هر نقطه ای بود خوبه.
کد:
Blank = GetPixel(Picture1.hdc, 0, 0)
در آخر سکه های باقی مونده مثل همون متنی میشن که نوشتی.
حالا میتونی متن رو از رو صفحه پاک کنی چون چیدمان سکه های باقی مونده نشون دهنده همون متنه و دیگه نیازی به متن نوشته شده نداری.
کد:
Picture1.Cls
نکته: ممکنه موقع کنترل کردن سکه ها به یه سکه بر بخوری که زیرش فقط یکم رنگی باشه یعنی تمام مساحت زیرش رنگ نخورده؛ فقط قسمتی از اون رنگیه.
پس شما نقطه مرکز هر سکه رو در نظر می گیری که اگه رنگی بود سکه بمونه و اگه نه اونو دور بندازی.
کد:
X = shp(Index).Left + shp(Index).Width \ 2
Y = shp(Index).Top + shp(Index).Height \ 2
GetPixel(Picture1.hdc, X, Y)
نقل قول: اگه خط به خط باشه كه عاليه
وقتش رو هم که داشته باشم هنرش رو ندارم. این کار یه معلمه. هنر آموزش و انتقال مطلب یه چیز خاصه!
سلام

یه سوال

الان (پيکسل هاش 7 در 7 )
چه طور می تونم بفهمم کدوم دایره روشنه کدوم خاموشه
سلام آقا مجتبی

بابا تو دیگه کی هستی
2 روز دارم برنامه رو می خونم تا فهمیدم و درکش کردم


خیلی عالی نوشتی
الگوریتم عالی بود


راستی می شه منم راهنمایی کنی چطور به گرافیک vb مسلط یشم
مثلا همین image, print , getpixel,biteltو.............

کتابی منبعی و .........
ممنوننتم
چند نکته در ویژوال بیسیک
1ـ همیشه خاصیت ScaleMode در شیء Form و PictureBox را برابر VBPixels قرار دهید تا محاسبات بر حسب پیکسل باشند ولی برای کار با طول عرض فرم و مانیتور مجبورید از Twips استفاده کنید که اگر تقسیم بر 15 بشه به پیکسل تبدیل میشه. اما این عدد 15 از کجا میاد؟ Screen. TwipsPerPixelX و Screen. TwipsPerPixelY رو مشاهده کنید.
2ـ فضای قابل استفاده در Form و PictureBox با طول و عرض Form یا PictureBox فرق می کنه. باید از ScaleWidth و ScaleHieght استفاده کنید.
مثال: می خواهیم عرض PictureBox برابر 10 پیکسل باشد تا یک عکس با عرض 10 داخلش Load کنیم:
کد:
Picture1.Width = Picture1.Width – Picture1.ScaleWidth + 10
مقدار Picture1.Width – Picture1.ScaleWidth در واقع اندازه ی قاب دور PictureBox است که اگر BorderStyle = 0 باشد قاب دور آبجکت هم صفر میشه.
3ـ برای گرفتن رنگ پیکسل بجای Point از تابع GetPixel استفاده کنید. و برای مقدار دادن به یک پیکسل بجای PSet از تابع SetPixelV استفاده کنید. سرعت تابع SetPixelV از تابع SetPixel بیشتر است.
4ـ اگر خاصیت AutoRedraw آبجکت True باشد بعد از استفاده از SetPixel یا SetPixelV باید Refresh کنید.
5ـ اگر خاصیت AutoRedraw برابر False باشد با رخ دادن رویداد Paint آبجکت، نقاشی ها و رنگ های روی آبجکت از بین می روند. برای جلوگیری از پاک شدن چیزهایی که با متدهای گرافیکی رسم کرده اید این خاصیت را برابر True قرار دهید.
6ـ برای پیمایش عکس از صفر تا عرض عکس منهای 1 و از صفر تا ارتفاع عکس منهای 1، پیکسل ها را می خوانیم. چون اولین پیکسل دارای موقعیت 0, 0 و آخرین پیکسل دارای موقعیت ScaleWidth – 1, ScaleHeight – 1 است.
آخرین و مهمترین نکته اینه که من به گرافیک VB مسلط نیستم ولی همینهایی که بلدم از دوستان توی انجمن و از Sample های API-Guide یاد گرفتم. کتابی هم سراغ ندارم چون جز کتاب هنرستان و آموزش گام به گام ویژال بیسیک دیگه هیچ کتابی استفاده نکردم.
مهمترین منبع API-Guide هستش و اگه جایی گیر کردی تو انجمن های برنامه نویسی مثل همینجا میتونی مطرح کنی. جستجوی Google و Yahoo و ... رو هم فراموش نکن.


نقل قول: چه طور می تونم بفهمم کدوم دایره روشنه کدوم خاموشه

[تصویر:  IranBoardXY.jpg]

تو تصویر زیر مربع ها رو پیکسل فرض کن (هر چند که خیلی بزرگ هستند)
به علاوه های زرد رنگ رو هم برای نشون دادن مرکز دایره ها رو گذاشتم
دایره شماره 1 مرکزش رنگیه پس باید روشن بشه. اما چطور مختصات مرکز رو بدست بیاریم.
مختصات وسط هرچیزی میشه عرضش تقسیم بر 2
یعنی اگه عرض دایره 10 پیکسل باشه وسطش میشه 5
اما فاصله دایره از کناره صفحه رو هم باید به این مقدار اضافه کنی که با خط دوسر فلش دار سفید مشخص شده.

دایره 3 هم همینطور

اما دایرهای 2 و 4 با اینکه قسمتی از مساحتشون رنگی شده ولی نباید روشن بشن چون ما مختصات مرکز رو ملاک گرفتیم و اگر مرکز دایره ای رنگی بود باید روشن بشه.
خیلی خیلی ممنون

این hdc تو تابع getpixel یعنی چی ؟
مثلا:

GetPixel(Picture1.hdc, X, Y)
خوب حالا اگر خواسته باشیم با یه فونت و سایز دیگه تبدیل کنیم باید چی کار کنیم .

ممنون
(۳۰-مهر-۱۳۸۷, ۱۶:۵۸:۵۸)alirezalahij نوشته است: [ -> ]خیلی خیلی ممنون

این hdc تو تابع getpixel یعنی چی ؟
مثلا:

GetPixel(Picture1.hdc, X, Y)
hdc بستر شیء ماست که تصاویر و متدهای نقاشی روی اون رسم میشن. اگر شیئی hdc نداشته باشه نمیشه با متدهای گرافیکی چیزی روش رسم کنیم.
(۳۰-مهر-۱۳۸۷, ۲۳:۳۷:۴۸)dreamvbfox نوشته است: [ -> ]خوب حالا اگر خواسته باشیم با یه فونت و سایز دیگه تبدیل کنیم باید چی کار کنیم .

ممنون
فونت PictureBox رو عوض کن.
وقتی از Picture1.TextWidth و Picture1.TextHeight استفاده کردم یعنی اینکه محاسبات بر حسب اندازه ی فونت Picture1 انجام میشن.
صفحه‌ها: 1 2 3 4