我正在拍摄4k屏幕的屏幕截图,但是我希望将其尺寸缩小到900x540,然后再将其复制到给定的byte[] buffer
中,以使其更快。
我不知道如何调整截图大小。
public void Screenshot(byte[] buffer)
{
//full screen width and height
using (var BMP = new Bitmap(Params.Width, Params.Height))
{
using (var g = Graphics.FromImage(BMP))
{
g.CopyFromScreen(Point.Empty, Point.Empty, new Size(Params.Width, Params.Height), CopyPixelOperation.SourceCopy);
g.Flush();
var bits = BMP.LockBits(new Rectangle(0, 0, Params.Width, Params.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
Marshal.Copy(bits.Scan0, buffer, 0, buffer.Length);
BMP.UnlockBits(bits);
}
}
}
编辑:在Stefan回答之后,我尝试了一下,但是这只是将整个屏幕的一小部分放在buffer
中,它只是将其剪切掉了。
public void Screenshot(byte[] buffer)
{
using (var BMP = new Bitmap(Params.TargetWidth, Params.TargetHeight))
{
using (var g = Graphics.FromImage(BMP))
{
g.CopyFromScreen(Point.Empty, Point.Empty, new Size(Params.WidthSource, Params.HeightSource), CopyPixelOperation.SourceCopy);
g.Flush();
var bits = BMP.LockBits(new Rectangle(0, 0, Params.TargetWidth, Params.TargetHeight), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
Marshal.Copy(bits.Scan0, buffer, 0, buffer.Length);
BMP.UnlockBits(bits);
}
}
}
这就是buffer
的结尾:
答案 0 :(得分:0)
如果您不需要特殊要求,可以使用bitmap constructor overloads之一:
更新:
我认为您正因为此而获取部分副本:
using (var BMP = new Bitmap(Params.WidthSource, Params.HeightSource))
和:
var bits = BMP.LockBits(
new Rectangle(0, 0, Params.WidthSource, Params.HeightSource),
ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
结合:
//where you have access to the BMP.
var resizedBmp = new Bitmap(BMP,Params.TargetWidth, Params.TargetHeight);
应该工作:-)
确保完成后将其丢弃。
处理非常重要,因为不适合使用垃圾回收器,因为特别是在处理大量图像时,GC会变慢,并且内存占用量会爆炸。