Bir proje için 🚧 ihtiyacım oldu fakat ekran resmini 💻 tüm monitörlerde yakalamak için yazılan bir fonksiyon bulamadım, bulduklarım sadece tek ekran resmini çekiyordu. Hiç bir bağımlılık olmadan windows yüklü bir makinede herhangi bir arayüzde çalışabilir. Aşağıdaki küçük ama ioldukça işe yarar 👌fonksiyonu yazdım, herhangi bir arayüzde kullanabilirsiniz. Monitör adeti kadar ekran resmi alınacaktır. Çözünürlük vb. farklı olması önemli değil, tüm aktif görüntüler yakalanacaktır. Ben aynı çözünürlükteki(1680*1050) iki monitörle test ettim. Aynı çözünürlüklerde hiçbir değişiklik olmadan ekranlar yakalanıyor. Aşağıda aldığım 3060*1050 çözünürlükteki test resmini büyüterek görebilirsiniz.
Farklı çözünürlüklerde yakalanan resim, küçük olanın çözünürlüğü büyük olan kadar yatayda ve dikeyde boş alanlar eklenir. Buna hiç dokunmadım çünkü küçük çözünürlüğü büyük olanla aynı yaparsanız, malum görüntü bozulacaktır. Benim ihtiyacım olmadığı için hiç denemedim duruma göre farklı görüntü işleme kütüphaneleri ile araştırıp bunun kararını verebilirsiniz.
ScreenShotHelper.cs
using System;
using System.ComponentModel;//You can remove it if you will catch the below exception from another layer
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
namespace Helpers {
public static class HelperScreenShot {
public static void TakeAndSaveByAllScreen(ImageFormat imageFormat, string fullFileName = null) {
var img = CopyFromScreen();
if(img == null) return;
if(string.IsNullOrWhiteSpace(fullFileName)) {
fullFileName = $"{Guid.NewGuid()}.{imageFormat.ToString().ToLower()}";
}
img.Save(fullFileName, imageFormat);
}
public static Image Take() {
return CopyFromScreen();
}
public static void TakeAndSave(string fullFileName, ImageFormat imageFormat) {
using var image = CopyFromScreen();
image?.Save(fullFileName, imageFormat);
}
public static byte[] TakeAsBinary(ImageFormat imageFormat) {
using var image = CopyFromScreen();
if(image == null) return default;
using var ms = new MemoryStream();
image.Save(ms, imageFormat);
return ms.ToArray();
}
private static Bitmap CopyFromScreen() {
try {
var size = HelperDisplay.GetVirtualScreenSize();
var image = new Bitmap(size.Width, size.Height);
using var graphics = Graphics.FromImage(image);
graphics.CopyFromScreen(Point.Empty, Point.Empty, size);
return image;
}
catch(Win32Exception) {//When screen saver is active
return null;
}
}
private static class HelperDisplay {
[DllImport("user32.dll")]
private static extern int GetSystemMetrics(MetricType metricType);
public static Size GetVirtualScreenSize() {
var width = GetSystemMetrics(MetricType.VirtualScreenWidth);
var height = GetSystemMetrics(MetricType.VirtualScreenHeight);
return new Size(width, height);
}
private enum MetricType {
VirtualScreenWidth = 78,
VirtualScreenHeight = 79
}
}
}
}
Kullanım örnekleri aşağıda.
var dir = Path.Combine("images", "screenshot");
var imgFormat = ImageFormat.Png;
var fileName = $"{Guid.NewGuid()}.{imgFormat.ToString().ToLower()}";
fileName = Path.Combine(dir, fileName);
if(!Directory.Exists(dir)) {
Directory.CreateDirectory(dir);
}
HelperScreenShot.TakeAndSaveByAllScreen(fileName, imgFormat);
//or
var binaryImg = HelperScreenShot.TakeAsBinary(imgFormat);
- Çözünürlükden bağımsız olarak her bir monitör görüntüsü yakalanır.
- Farklı çözünürlüklerde boş kalan bölüm kadar resim uzatılır.
- Veri tabanında binary alanlara ya da disk üzerinde dosya olarak kaydedilebilir.
Multiple Monitor System Metricswinuser.h headerHow do you use System.Drawing in .NET Core?Is there a method of screenshot for all virtual displays?
0 Yorum