زبان برنامه نویسی وی.بی6 یا 2008 , عکس گرفتن

A_123

Member
سلام بچه ها و مخصوصا ادمین

ببینید یه برنامه می خوام که با استفاده از تایمری که در برنامه است و ما بهش زمان می دیم, بیاد از صفحه نمایش عکس بگیره. مثل زمانی که دکمه print Screen SysRq روی کیبرد رو فشار میدیم. بعد بیاد اوون عکس ها رو با نام "زمانیکه اوون عکس گرفته شده" در پوشه ی ای که بهش میدیم ذخیره کنه.

مثلا به تایمر میدیم 1000 ms و اگر در زمان 10:50 است که داره از صفحه نمایش عکس میگیره, اسم فایلی رو که میخواد ذخیره کنه اینجوری بشه: [10]-[50].bmp یا یه فرمت دیگه
 

the_king

مدیرکل انجمن
سلام بچه ها و مخصوصا ادمین

ببینید یه برنامه می خوام که با استفاده از تایمری که در برنامه است و ما بهش زمان می دیم, بیاد از صفحه نمایش عکس بگیره. مثل زمانی که دکمه print Screen SysRq روی کیبرد رو فشار میدیم. بعد بیاد اوون عکس ها رو با نام "زمانیکه اوون عکس گرفته شده" در پوشه ی ای که بهش میدیم ذخیره کنه.

مثلا به تایمر میدیم 1000 ms و اگر در زمان 10:50 است که داره از صفحه نمایش عکس میگیره, اسم فایلی رو که میخواد ذخیره کنه اینجوری بشه: [10]-[50].bmp یا یه فرمت دیگه

پنجره خود برنامه باید Visible اش False باشه، وگرنه داخل Screenshot ها تصویر پنجره برنامه هم دیده میشه.
برای دریافت کردن یک تصویر از صفحه باید توابع API رو بکار ببرید.

یک نگاهی به پروژه پیوستی بندازید : SaveScreenshot.zip
 

پیوست ها

  • SaveScreenshot.zip
    5.8 کیلوبایت · بازدیدها: 12

A_123

Member
خیلی برنامه عالیه. فقط "علی سعید" جان, کیفیت عکسایی که میگیه خیلی بالاست. حدود 2.5 مگ. اگه بخوام عکساش کم کیفیتر باشه باید چیکار کرد؟
 

the_king

مدیرکل انجمن
خیلی برنامه عالیه. فقط "علی سعید" جان, کیفیت عکسایی که میگیه خیلی بالاست. حدود 2.5 مگ. اگه بخوام عکساش کم کیفیتر باشه باید چیکار کرد؟

فرمت BMP همینطوره، کیفیت اش تصویرش عالیه اما اصلا فشرده سازی نداره و فایل هاش حجیمه.
کاری به کیفیت اش نداشته باشید، الزاما قرار نیست برای کاهش حجم فایل کیفیت تصویر رو کاهش بدهید،
متاسفانه BMP تنها فرمتی است که ویژوال بیسیک 6 بدون ابزار اضافی ذخیره می کنه.
اگه تصاویر رو بصورت JPEG ذخیره کنید با افزایش میزان فشردگی کیفیت اش کاهش پیدا می کنه که البته قابل تنظیمه،
می توانید با کیفیت 100 درصد ذخیره اش کنید تا کیفیت هم افتی محسوسی نداشته باشه.

یه ابزار مجانی Bmp2Jpg رو به پروژه اضافه کردم که تصاویر bmp رو به jpg با کیفیت ثابتی تبدیل می کنه،
سازنده اش ادعا می کنه که از کیفیت 100 درصد استفاده می کنه اما با خروجی اش چیز دیگه ای رو نشون میده :green:
چون فایل bmp رو خودش پاک نمی کنه، یک فایل bat به پروژه اضافه کردم که اینکار رو انجام بده.
الان همون شده که شما می خواهید، هم حجم فایل خروجی کم شده و هم کیفیت تصویر.

Auto Screenshot 2.zip
 

پیوست ها

  • Auto Screenshot 2.zip
    9.8 کیلوبایت · بازدیدها: 14

A_123

Member
thank%20you%20cards%2010679.jpg


خیلی ممنون که وقت گزاشتی.
هر وقت حال داشتی راجع به توابع DoEvents ؛ ReleaseDC ؛ GetDesktopWindow ؛ GetDC خصوصیت های ScaleMode و AutoRedraw و به طور کلی چگونگی کارکرد برنامه! برامون بگو.
باز هم تشکر:rose:
 

the_king

مدیرکل انجمن
thank%20you%20cards%2010679.jpg


خیلی ممنون که وقت گزاشتی.
هر وقت حال داشتی راجع به توابع DoEvents ؛ ReleaseDC ؛ GetDesktopWindow ؛ GetDC خصوصیت های ScaleMode و AutoRedraw و به طور کلی چگونگی کارکرد برنامه! برامون بگو.
باز هم تشکر:rose:

فرمان DoEvents :
در ویندوز درخواست هایی که خارج از یک روال مشخص اجرا می شوند مستقل از هم هستند و دقیقا مشخص نیست
که کی اجرایشان به پایان می رسد، مثلا ما از ویندوز درخواست کرده ایم که تصویر داخل PictureBox ای را داخل
فایل bmp ذخیره کند. اما برنامه ما الزاما تا پایان اینکار معطل نمی شود و به اجرای کد های بعدی می پردازد.
ممکن است برنامه آنقدر سریع سراغ درخواست تبدیل فایل bmp به jpg برود که هنوز ذخیره سازی فایل bmp
کامل نشده باشد. فرمان DoEvents به سیستم اعلام می کند که برنامه تا زمانی که درخواست نیمه کاره ای
وجود دارد معطل شود تا همه درخواست های قبلی به پایان اجرایشان برسند. در واقع استفاده کردن از
DoEvents این تضمین را به ما می دهد که درخواست های قبلی پیش از اجرا کد بعدی کاملا خاتمه یافته اند.

تابع GetDesktopWindow :
تابع GetDesktopWindow شماره Handle پنجره Desktop را اعلام می کند. یکی از خصوصیات پنجره Desktop
در این است که تصویر آن همه آن چیزی است که روی صفحه نمایشگر مشاهده می شود، یعنی دقیقا تصویر
Screenshot نمایشگر است.

مفهوم Handle پنجره ها :
هر پنجره ای یک شماره مخصوص خود را دارد (مثل شماره شناسنامه) که به آن Handle می گویند، مثلا مشخصه
hWnd که در فرم ها و اکثر کنترل های ویژوال بیسیک وجود دارد، شماره Handle پنجره آن شیء را مشخص می کنند،
مثل Picture1.hWnd یا Form1.hWnd یا Text1.hWnd
توابع API ویندوز پنجره ها را با این شماره Handle می شناسند و اگر بخواهید فرضا در مورد پنجره Form1 کاری
را با توابع API ویندوز انجام دهید بجای نام Form1 باید از شماره Form1.hWnd استفاده کنید.

توابع GetDC و ReleaseDC :
اگر بخواهید شماره Handle یک DC را بدست بیاورید، از تابع GetDC استفاده خواهید کرد. از آنجایی که این
شماره Handle دارای یک منبع نامحدود نیست و یک دسترسی اختصاصی و موقتی را برای برنامه ایجاد می کند
باید هر زمانی که کارتان با DC تمام شد با استفاده از تابع ReleaseDC آنرا آزاد کنید.

مفهوم Handle برای DC ها :
اگر بخواهید روی یک شیء ای چیزی رسم کنید یا تصویرش را بخوانید یا تغییر دهید باید به Device Context
آن شیء دسترسی داشته باشید که به اختصار DC نامیده می شود. در ویندوز هر چیزی که بتوانید داخلش
رسم کنید یا تصویر داشته باشد DC دارد، مثلا پنجره هایی که تصویر دارند و چاپگر (پرینتر)
DC هم مثل پنجره توسط یک شماره Handle شناسایی می شود، مثلا مشخصه hDC که در فرم ها و برخی از
کنترل های ویژوال بیسیک وجود دارد، شماره Handle ای است که DC آن شیء را مشخص می کند،
مثل Picture1.hDC و Form1.hDC

مفهوم ScaleMode :
واحد اصلی رسم گرافیکی در ویندوز پیکسل است اما در ویژوال بیسیک می تواند با هر واحد نسبی دیگری
هم انجام شود، مثل سانتی متر و میلی متر و ... بنا بر این قبل از اینکه بخواهید چیزی ترسیم کنید و یا
ابعاد یک تصویر را بسنجید باید واحد آنرا مشخص کنید. واحد پیشفرض در ویژوال بیسیک Twips است، هر
سانتی متر برابر با 567 Twips است.

مفهوم AutoRedraw :
اگه AutoRedraw در حالت False باشه، هر چیزی که روی فرم یا PictureBox رسم می کنید فقط و فقط
روی صفحه نمایش رسم میشه و در حافظه داخل شیء ثبت نمیشه. در نتیجه اگر پنجره ای روی شیء
حرکت کند آنچیزی که قبلا ترسیم کرده اید پاک می شود. از آن بدتر اینکه موقع ذخیره کردن تصویر
ترسیم ها ثبت نمی شوند. بنابر این AutoRedraw را به True تغییر می دهیم تا آنچه که ترسیم می شود
در حافظه Image ثبت شود. سرعت ترسیم در حالتی که AutoRedraw مقدار True دارد کندتر است
و حافظه RAM بیشتری مصرف می کند و به همین دلیل بصورت پیشفرض False می باشد.

برنامه یک PictureBox را به اندازه صفحه Desktop بزرگ می کند، سپس پنجره Desktop را پیدا می کند، و با
استفاده از DC اش هر چیزی که داخلش ترسیم شده به داخل PictureBox درون برنامه کپی می کند.
بعد محتویات PictureBox را با فرمت bmp ذخیره می کند. سپس با bmp2jpg آن فایل را به jpg تبدیل می نماید.
 

جدیدترین ارسال ها

بالا