PDA

View Full Version : کار با فضانام stdpicture



mehran901
شنبه 28 بهمن 1391, 12:19 عصر
سلام بر دوستان

کسی با پروسیجر render فضا نام stdpicture کار کرده آیا ؟
اگه تجربه ای راجب کار با این فضانام دارین خوشحال میشم بیشتر بازش کنین

( البته خودم یکمی ازش اطلاعات دارم ولی میخوام با اکثر متدهاش کار کنم و دقیقا کشفش کنم :D )


dim m as stdpicture
m.render .... ?

vbhamed
یک شنبه 29 بهمن 1391, 10:41 صبح
سلام

متد Render براي كپي تصوير از منبعي به منبع ديگه هست كه در حين اينكار مي‌تونيد عمل برش و بزرگنمايي و كوچك نمايي هم انجام بدين
براي نمونه يك عكس روي فرم بزاريد، يك PictureBox هم قرار بديد و خاصيت AutoRedraw اون رو True كنيد و كد زير رو هم درج كنيد
پارامتر z ميزان بزرگنمايي رو تعيين مي‌كنه
Private Sub Form_Load()

Dim thePic As StdPicture
Set thePic = Me.Picture

Dim z!
z = 0.4
With thePic
.Render Picture1.hDC Or 0&, 0&, 0&, ScaleX(.Width, vbHimetric, vbPixels) * z, ScaleY(.Height, vbHimetric, vbPixels) * z, _
0&, .Height, .Width, -.Height, ByVal 0&
End With

End Sub

mehran901
دوشنبه 30 بهمن 1391, 11:51 صبح
سلام و ممنون از توجهتون ،

خب درمورد متد های دیگه ای مثل type و hpal چ کار هایی میشه انجام داد و دقیقا چی هستن میدونین؟؟

تشکر ویژه :قلب:

mehran901
سه شنبه 01 اسفند 1391, 01:26 صبح
یک سوال دیگه واسم پیش اومده ، دوست عزیز در پیکچرباکس ما برای به دست آوردن رنگ هر نقطه از متد point استفاده میکنم حالا اگه تصویری داخل stdpicture ریخته بشه چطور میتونیم بدون استفاده از متد پیکچر باکس با استفاده از stdpicture رنگ مختصات خاصی روبه دست بیاریم ؟ راهی به ذهنتون میرسه ؟

و همین طور چرا وقتی عکسی داخل stdpicture ریخته میشه ابعاد stdpicture با ابعاد عکس متفاوت هست ؟

کلا راهی به ذهنتون میرسه که بتونیم یک عکس رو تو حافظه لود کنیم و از روی مختصات پیکسل های مختلفش ، رنگ پیکسل ها رو به دستبیاریم به شکلی کهسرعت بیشتری نسبت به متد point پیکچر باکس داشته باشه ؟


ممممممنون

vbhamed
سه شنبه 01 اسفند 1391, 09:19 صبح
سلام

ابعاد عكس متفاوت نيست، واحد اندازه گيري فرق داره
در مورد عكس در حافظه هم اين يك نمونه كه رنگ كلي عكس رو تغيير ميده
فقط يك عكس روي خود فرم (نه PictureBox) قرار بديد
Option Explicit

Private Type BITMAP

bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long

End Type

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long

Private Sub Form_Load()

On Error Resume Next

Dim PicBits() As Byte, PicInfo As BITMAP

GetObject Me.Picture, Len(PicInfo), PicInfo

ReDim PicBits((PicInfo.bmWidth * PicInfo.bmHeight * 3) - 1) As Byte

GetBitmapBits Me.Picture, UBound(PicBits), PicBits(0)

Dim i&, j&, c!

For i = 0 To UBound(PicBits) Step 3
PicBits(i) = PicBits(i) + 30
'PicBits(i + 1) = 0
PicBits(i + 2) = 0
Next

SetBitmapBits Me.Picture, UBound(PicBits), PicBits(0)

End Sub

mehran901
سه شنبه 01 اسفند 1391, 13:30 عصر
ابعاد عكس متفاوت نيست، واحد اندازه گيري فرق داره

[/VB]
ممنون از کمکتون و توجهی که داشتین ،

والا اینو بنده هم میدونم میدونید مشکل کجاست ؟ مشکل اینه مثلا 128 پیکسل ارتفاع دارم ولی ارتفاع stdpicturebox ، صفر !! هست .... دراین مورد کار از واحد گذشته :D

mehran901
سه شنبه 01 اسفند 1391, 13:47 عصر
و ی چیز دیگه ، یک عکس رو اگه بخوایم داخل حافظه لود کنیم و بعد رنگ پیکسل به پیکسلش رو با ی حلقه بخونیم ( واسه افزایش سرعت ) شما چه پیشنهادی دارین ؟


تشکر ویژه:چشمک:

vbhamed
سه شنبه 01 اسفند 1391, 22:51 عصر
سلام

اول جواب سؤال دومتون رو بدم، تو مثال پست شماره 5 دقيقا همين كار انجام شده يعني كل پيكسلهاي عكس داخل يك آرايه ريخته شده و با يك حلقه روش تغييري داده شده (در اينجا رنگ عكس تغيير كرده)

دوم براي مختصات :
اولا مختصاتي كه stdPicture.Width, .Height ميده صفر نيست و اگر تقسيم بر عدد تقريبي 26.4 بشه ابعاد واقعي بدست مياد
دوم در مورد آرايه
باز هم مثال بالا و آرايه PicBits رو در نظر بگيريد
فرض كنيد عكس اصلي شما 600*800 باشه يعني 480000 پيكسل
براي ذخيره عكس در آرايه به 1440000 بايت فضا احتياج داريم چون براي هر پيكسل سه بايت براي رنگهاي اصلي RGB يعني قرمز، سبز، آبي مورد نياز هست
پس براي پيكسل سوم تصوير بايد خونه 6 و 7 و 8 آرايه رو استفاده كنيم و براي سطر r و ستون c خونه آرايه ميشه :
((r-1)*width+c)*3

mehran901
پنج شنبه 03 اسفند 1391, 01:41 صبح
براي ذخيره عكس در آرايه به 1440000 بايت فضا احتياج داريم چون براي هر پيكسل سه بايت براي رنگهاي اصلي RGB يعني قرمز، سبز، آبي مورد نياز هست
پس براي پيكسل سوم تصوير بايد خونه 6 و 7 و 8 آرايه رو استفاده كنيم و براي سطر r و ستون c خونه آرايه ميشه :
((r-1)*width+c)*3
سلام بر vbhamed عزیز ، جدا ممنون بابت توجه خوبتون

آره ، معذرت میخوام بی دقتی من بود که باعث پرسیدن اون سوال درمورد لود تصویر تو حافظه شد ،

میشه اون تیکه آخر رو بیشتر توضیح بدین ؟ مثلا خونه 154 آرایه شامل عدد 178 هست! این عدد بخشی از RGB اون نقطه هست که به تفکیک در 3 آرایه پشت سرهم مجزا اومده درسته ؟ منظورتون همین بود ؟

حالا به نظرتون من چطوری بفهمم R G B ها به چه ترتیبی داخل آرایه قرار گرفتند ؟ ( البته تست با ی عکس تنها موردی هست که الان به ذهنم رسید)
اگه اینطور که گفتمباشه پس میشه 3 تا سه تا مقادیر آرایه رو به ترتیب داخل هر یک از آرایه سه بعدی ای ریخت که شامل RGB تفکیک شده براساس شماره پیکسل باشن دیگه :متفکر:

اون رابطه آخری رو میشه یکم شفاف تر کنین؟ مثلا سطر 52 و ستون 20 در این رابطه به چی میرسیم؟

و چرا واسه بررسی رنگ پیکسل سوم باید خونه 6 7 8 آرایه رو بررسی کرد ؟


مثلا ببین من استپ رو 100 گذاشتم ، همون طوری که تو تصویر زیر مشخصه ، ترتیب چرخش رنگ رو ببین ... تو تغییر رنگ سطر و ستون ها موندم ، مثلا ببین من در هر 100 خونه آرایه تغییر 30 تایی ایجاد کردم ولی برخلاف انتظار خطوط رنگی منظم تکرار شدند! مثلا به آخر سطر اول که رسید میاد سطر دوم دیگه ؟ همین طوری باید باشه دیگه نه ؟

خب مقدار رنگ سطر دوم در اولین استپ ، وقتی با 30 جمع بشه چرا با رنگ سطر اول در اولین اجرای حلقه یکی شده ؟ البته picbits(i +2) = 0 رو در نظر گرفتم ، حتی با حذف اون ، اینجور مسئله ای هست

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



تشکر دارم!



100349

vbhamed
پنج شنبه 03 اسفند 1391, 07:49 صبح
سلام
اينم يك تيكه كد در مثال بالا براي تغيير رنگ سطر و ستوني (r سطر و c ستون تصويره)
البته چون از 0 شروع كردم تو فرمول بالا r-1 رو تبديل به r كردم
Dim r&, c&, w&, h&, s&
w = Me.Picture.Width / 26.46
h = Me.Picture.Height / 26.46
For c = 0 To w Step 1
For r = 0 To h Step 2
s = (r * w + c) * 3
PicBits(s) = 255
PicBits(s + 1) = r Mod 255
PicBits(s + 2) = c Mod 255
Next
Next

در مورد اينكه چرا براي پيكسل سوم بايد خونه 6 و 7 و 8 هم بايد تغيير كنه توضيح دادم كه هر پيكسل سه رنگ داره بنابراين سه بايت مي‌خواد پس پيكسل اول خونه 0 و 1 و 2 هست پيكسل دوم خونه 3 و 4 و 5 و پيسكل سوم خونه 6 و 7 و 8 و ... (به همين راحتي)

mehran901
پنج شنبه 03 اسفند 1391, 12:11 عصر
پس این طور که فرمودین ، خونه 0 رنگ قرمز پیکسل یک خونه 1 رنگه سبزش و خونه 2 رنگ آبی رو در بر داره دیگه ؟ باید به همین ترتیب باشه نه ؟

تشکر

vbhamed
پنج شنبه 03 اسفند 1391, 12:16 عصر
سلام

خونه 0 : آبي
خونه 1 : سبز
خونه 2 : قرمز

SlowCode
جمعه 04 اسفند 1391, 20:46 عصر
خیلی عالیه ممنون.
فقط نمیشه اینو از پیکچر باکس بخونیم و تو همین کنترل نمایش بدیم؟ هیچ راهی نیست؟!!

mehran901
جمعه 04 اسفند 1391, 22:47 عصر
خیلی عالیه ممنون.
فقط نمیشه اینو از پیکچر باکس بخونیم و تو همین کنترل نمایش بدیم؟ هیچ راهی نیست؟!!

محسن جان ، من با پیکچر باکس تست کردم هیچ مشکلی وجود نداره

راستی آقا حامد اون 26.4 از کجا اومد ؟ با آزمایش به دست آوردین ؟

کلا تصویر وقتی وارد فضانام stdpicture میشه تغییر سایز میده مگه ؟ که گفتین ابعادش رو واسهبه دست آوردن ابعاد واقعی تقسیم بر 26.4 کنم /

تشکر ویژه

vbhamed
شنبه 05 اسفند 1391, 09:53 صبح
سلام

راستش من يك تصوير با سايزي كه مي دونستم چنده گذاشتم روي فرم، مثلا 800x600 بعد عددي كه stdpicture براي عرض مي‌داد رو تقسيم بر 800 كردم 26.4 بدست اومد (البته با تقريب)، براي ارتفاع هم همين عدد شد ولي خب شايد تابعي براي محاسبه هم داشته باشه

mehran901
جمعه 18 اسفند 1391, 17:28 عصر
دوست عزیز ویبی حامد ، ی مشکل اساسی دهن ما رو آسفالت کرده :اشتباه: :اشتباه: اگه لطف کنی ی راهکار بدی ممنون میشم :چشمک:

مشکل اینجاست که من عکس رو داخل آرایه میریزم ( طبق صحبت های بالا و نمونه کد خودت ) و حالا میخوام ستون یک اندیس خاص آرایه رو پیدا کنم ( یعنی یک پیکسل با رنگ مشخص در چ x y ای قرار داره ) ولی نمیشه که نمیشه.... ! یعنی خطای خیلی زیادی داره

من میخوام در اصل مختصات لبه ی یک مستطیل قرمز رنگ رو در زمینه مشکی پیدا کنم ... سورسم رو ضمیمه کردم سطر رو به سادگی میشه تشخیص داد ولی ستون رو نه! درست کار میکرد عکس رو عوض کردم کلا همه چی بهمریخته ... نمی دونم چ اتفاق داره میوفته ی نگاه اگه میتونی بهش بنداز بلکه ی راهی به نظرت بیاد :p

**************************************************

درست شد ، scalewidth , scaleheight پیکچر باکس خطا داشت ! با استراکچر picinfo و از تابع getobject که استفاده کردم مشکل برطرف شد