الكود التالي يوضح كيف تقوم بعمل CopyFromScreen الخاصة بأي جهاز كمبيوتر ثم حفظ الصورة في فهرس المشروع
لتنفيذ الكود ضع الكود في الحدث Load الخاص بالفورم كما هو موضح أدناه أو يمكن استخدام الكود مع اي باتون في الحدث Click
PHP كود :
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim rect As Rectangle = Screen.PrimaryScreen.Bounds
Using scrBitmap As Bitmap = Image.FromHbitmap(New Bitmap(rect.Width, rect.Size.Height).GetHbitmap(), Graphics.FromHwnd(IntPtr.Zero).GetHdc())
Using g As Graphics = Graphics.FromImage(scrBitmap)
g.CopyFromScreen(rect.Location, rect.Location, rect.Size, CopyPixelOperation.SourceCopy)
scrBitmap.Save((".\" & DateTime.Now.ToFileTimeUtc & ".jpg"), Imaging.ImageFormat.Jpeg)
End Using
End Using
End Sub
End Class
الكود اعلاه يمكن تنفيذه من خلال تايمر لتصوير الشاشة كل فترة زمنية معينة ثم يتم جمع كل الصور و تحويلها الي ملف Gif أو ملف فيديو
ويمكن الاستغناء عن السطر الذي يقوم بحفظ الصورة و نضيف الصور الي مصفوفة وبحيث يسهل التعامل معها كيفما نريد
رائع بارك الله فيك والله انك مبدع .
اقسم بالله انك عضو خيالي
امنى اني اوصل لدرجة احترافك
+
هل يمكنك شرح الكود بارك الله فيك يا مهندسنا الغالي
+ لماذا لم تعلن عن متغير بدلا عن استخدام using
تصوير شاشة الكمبيوتر بيحتاج اننا نخلق صورة بأبعاد تساوي ابعاد شاشة الكمبيوتر
مثلا لو نظرت الي الكود التالي هو بسيط جدا و نحن هنا لا نقوم بتصوير شاشة الكمبيوتر نهائي
نحن فقط نخلق الصورة و نحفظها و هنا ستلاحظ ان و في حالة عدم وجود لون الجرافكس الموجودة في الدوت نت ستقوم بملأ الصورة باللون الأسود
PHP كود :
Dim rect As Rectangle = Screen.PrimaryScreen.Bounds
Dim scrBitmap As Bitmap = New Bitmap(rect.Width, rect.Size.Height)
scrBitmap.Save((".\" & DateTime.Now.ToFileTimeUtc & ".jpg"), Imaging.ImageFormat.Jpeg)
الكود التالي مشابه تماما للكود أعلاه و فقط عليك ان تلاحظ انني ملأت الصورة باللون الشفاف حاول تغير اللون و لتري ما سيحدث معك
PHP كود :
Dim rect As Rectangle = Screen.PrimaryScreen.Bounds
Dim scrBitmap As Bitmap = New Bitmap(rect.Width, rect.Size.Height)
Using g As Graphics = Graphics.FromImage(scrBitmap)
g.Clear(Color.Transparent)
End Using
scrBitmap.Save((".\" & DateTime.Now.ToFileTimeUtc & ".jpg"), Imaging.ImageFormat.Jpeg)
عموما كل الطرق ستؤدي لنفس الغرض
الفكرة فقط في الكود الأول هو الحصول علي اللون الشائع في شاشات الكمبيوتر بشكل عام
و نملأ به الصورة
ثم نقوم بتصوير الشاشة و هذا ما يمكنك ان تطلق عليه MaskedImage
أي أن الصورة الظاهرة لكي تراها العين لها خلفية بلون ثابت كأنهم صورة مرسومة فوق صورة
وهذا الأمر له علاقة بشفافية الصور بشكل عام أيضا له علاقة بالفورم و الكونترول خصوصا و ان الفورم أو كل الكونترول يتم رسمهم علي صورة أصلا
عموما الكود يمكن كتابته بصور اخري كالتالي
PHP كود :
Dim rect As Rectangle = Screen.PrimaryScreen.Bounds
Using scrBitmap As Bitmap = New Bitmap(rect.Width, rect.Size.Height)
Using g As Graphics = Graphics.FromImage(scrBitmap)
g.CopyFromScreen(rect.Location, rect.Location, rect.Size, CopyPixelOperation.SourceCopy)
scrBitmap.Save((".\" & DateTime.Now.ToFileTimeUtc & ".jpg"), Imaging.ImageFormat.Jpeg)
End Using
End Using
أ و كالتالي
PHP كود :
Dim rect As Rectangle = Screen.PrimaryScreen.Bounds
Using scrBitmap As Bitmap = Image.FromHbitmap(New Bitmap(rect.Width, rect.Size.Height).GetHbitmap())
Using g As Graphics = Graphics.FromImage(scrBitmap)
g.CopyFromScreen(rect.Location, rect.Location, rect.Size, CopyPixelOperation.SourceCopy)
scrBitmap.Save((".\" & DateTime.Now.ToFileTimeUtc & ".jpg"), Imaging.ImageFormat.Jpeg)
End Using
End Using
حاول توقف السطر الخاص بتصوير الشاشة و لتري ماذا سيحدث معك كالتالي
PHP كود :
Dim rect As Rectangle = Screen.PrimaryScreen.Bounds
Using scrBitmap As Bitmap = Image.FromHbitmap(New Bitmap(rect.Width, rect.Size.Height).GetHbitmap())
'Using g As Graphics = Graphics.FromImage(scrBitmap)
'g.CopyFromScreen(rect.Location, rect.Location, rect.Size, CopyPixelOperation.SourceCopy)
scrBitmap.Save((".\" & DateTime.Now.ToFileTimeUtc & ".jpg"), Imaging.ImageFormat.Jpeg)
'End Using
End Using
لم اعلن عن متغير حتي يتم التخلص من الصورة مباشرة بعد تنفيذ الأمر من أجل عملية Disposing للصورة التي تم تخليقها و ليس للصورة التي يتم حفظها
الف شكر و تقدير اخي عمر
ولكن ما فائدة الامر using ?
اي كلاس في الدوت نت أساسه Interface IDisposable يمكن فقط استخدام الأمر Using معه و الهدف منها التخلص من العنصر حتي لا يؤثر علي ذاكرة الكمبيوتر
و البديل المناسب لتلك الجمله هو استخدم Try Catch Finally End Try
ذهب اخ عمر و الذهب ماينتج غير ذهب
بارك الله فيك و بعملك
جزاك الله خيرا
اريد توضيح هذه الجزئية وشكرا لك
إقتباس :و البديل المناسب لتلك الجمله هو استخدم Try Catch Finally End Try
الأخ علي
الكود سيكون شيئا من هذا القبيل
PHP كود :
Dim rect As Rectangle = Screen.PrimaryScreen.Bounds
Dim bmp As Bitmap = Image.FromHbitmap(New Bitmap(rect.Width, rect.Size.Height).GetHbitmap(), Graphics.FromHwnd(IntPtr.Zero).GetHdc())
Try
Dim g As Graphics = Graphics.FromImage(bmp)
Try
g.CopyFromScreen(rect.Location, rect.Location, rect.Size, CopyPixelOperation.SourceCopy)
bmp.Save((".\" & DateTime.Now.ToFileTimeUtc & ".jpg"), Imaging.ImageFormat.Jpeg)
Catch ex As Exception
Finally
If g IsNot Nothing Then
g.Dispose()
g = Nothing
End If
End Try
Catch ex As Exception
Finally
If bmp IsNot Nothing Then
bmp.Dispose()
bmp = Nothing
End If
End Try