需求:winform,界面有一個panel1容器,里面有一些控制元件。需要對panel1右半部分截圖:
Bitmap newBitmap = null;
//using (newBitmap = new Bitmap(panel1.Width, panel1.Height))
using (newBitmap = new Bitmap(panel1.Width / 2, panel1.Height))
{
//完整截圖
//panel1.DrawToBitmap(newBmp, new Rectangle(0, 0, newBmp.Width, newBmp.Height));
//希望對右半部分截圖,但截出來的是左半部分,只是顯示在了目的矩形的右半部分中
panel1.DrawToBitmap(newBitmap, new Rectangle(newBitmap.Width / 2, 0, newBitmap.Width / 2, newBitmap.Height));
//顯示截圖
Image img = Image.FromHbitmap(newBitmap.GetHbitmap());
pictureBox1.Image = img;
}
panel1.DrawToBitmap(newBitmap, new Rectangle(newBitmap.Width / 2, 0, newBitmap.Width / 2, newBitmap.Height));
這句代碼是希望對 panel1的右半部分截圖,但(newBitmap.Width / 2, 0)這個坐標不是截圖目標控制元件的起始截取坐標,而是顯示矩形中的起始坐標,截取的時候還是從源控制元件的(0,0)最左上角開始截圖。不知道有沒有辦法改下這行代碼從源控制元件的中間開始截圖。
//用螢屏坐標定位的方法可以截到右半邊,但是必須是在界面加載完顯示出來以后,再執行以下代碼才可以截到winform表單界面,否則截的是電腦桌面的對應區域,不符合需求。
Bitmap newBitmap = new Bitmap(panel1.Width / 2, panel1.Height);
Graphics g = Graphics.FromImage(newBitmap);
Point src = PointToScreen(new Point(panel1.Location.X + panel1.Width/2, panel1.Location.Y));
Point dest = new Point(0, 0);
g.CopyFromScreen(src, dest, new Size(newBitmap.Width, newBitmap.Height), CopyPixelOperation.SourceCopy);
g.Dispose();
//顯示截圖
Image img = Image.FromHbitmap(newBitmap.GetHbitmap());
pictureBox1.Image = img;
newBitmap.Dispose();
求截取目標控制元件右半部分的方法,能用DrawToBitmap方法搞定最好,百度了幾天沒有解決,謝謝大家!
uj5u.com熱心網友回復:
public void DrawToBitmap (System.Drawing.Bitmap bitmap, System.Drawing.Rectangle targetBounds);這里的targetBounds中文是目標框,指的是渲染到目標bitmap的哪個位置。
我想你要的是sourceBounds,但DrawToBitmap不支持。或許你可以整體渲染,然后再對半裁開。
不過,用其他工具比如WPF更容易出效果。
比如在WPF下,我們可以把一個WPF視元作為一個控制元件的背景來用:

<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800">
<StackPanel Orientation="Horizontal" >
<Grid Width="200" Height="200" Name="myedit" Background="Transparent">
<StackPanel>
<Label Content="編輯:" Background="LightCyan" />
<TextBox Text="ddsxd19" Background="PeachPuff" />
<Image Source="https://avatar.csdnimg.cn/1/8/A/1_ddsxd19.jpg" />
</StackPanel>
</Grid>
<Rectangle Margin="20 0 0 0"
Width="{Binding ActualWidth, ElementName=myedit}"
Height="{Binding ActualHeight, ElementName=myedit}" >
<Rectangle.Fill>
<VisualBrush Visual="{Binding ElementName=myedit}" > <!-- 把myedit視元,作為貼圖 -->
<VisualBrush.RelativeTransform><TranslateTransform X="-0.5" /></VisualBrush.RelativeTransform>
</VisualBrush>
</Rectangle.Fill>
</Rectangle>
</StackPanel>
</Window>
uj5u.com熱心網友回復:
謝謝回復。您說的DrawToBitmap 問題是對的。但整體渲染然后對半切的方法在我這不行。
就是因為在程式里按需求生成的容器panel尺寸過大,使用DrawToBitmap整體截圖時報錯“引數無效”,我才會想左右分開截兩次,然后再拼起來。
WPF這專案里沒用,其它工具我再找找吧。
uj5u.com熱心網友回復:
先全部截圖,然后對截取的圖片進行右半邊再次截圖;uj5u.com熱心網友回復:
謝謝回復。
因為panel容器尺寸過大,全部截圖會報錯“引數無效”我才會想左右分開截兩次,然后再拼起來。
不知道有沒有辦法在截圖時讓panel等比縮小截圖,這樣縮小尺寸后整體截圖就可以了。
uj5u.com熱心網友回復:
雖然沒弄過這種超大圖;
但是我想是否可以截取螢屏顯示的部分后,讓圖片平移,目的是讓隱藏的部分出現在顯示幕螢屏中;
uj5u.com熱心網友回復:
CopyFromScreen方法截圖超出螢屏范圍外的就截不到了uj5u.com熱心網友回復:
有沒有大佬能重寫DrawToBitmap方法,加一個引數 SourcePoint 指定源控制元件截圖的起始點uj5u.com熱心網友回復:
所以說你那個panel到底有多大啊?uj5u.com熱心網友回復:
所以說你那個panel到底有多大啊?
生成的panel尺寸在9000多*7000多。
但也有可能不是尺寸問題,因為有的時候也不報錯,能正常運行下去,報錯概率大概一半一半。
例外原因我感覺更可能是占用記憶體過大,我除錯看截圖的時候程式占用記憶體300000多K,
同時電腦可用記憶體4000000多K,但分配給該程式的可用記憶體具體多少不知道,可能不到300000K的時候就會報錯。
有時候比如在剛打開系統時,可能分配的記憶體足夠,所以就不報錯了。
而用的久了,記憶體分配小于panel截圖代碼所需記憶體時就拋出例外。不知道是不是這個原因。
我每次運行該程式前都做了記憶體資源回收釋放,能釋放的都釋放了。
uj5u.com熱心網友回復:
看到程式可分配記憶體了。電腦可用記憶體:4194303K
程式專用作業集記憶體:321928K
panel截圖記憶體:322468K
panel1.DrawToBitmap截圖時需要322468K,但程式可分配的專用作業集記憶體只有321928K,剛好少一點點,然后就報錯:
捕捉到 System.ArgumentException
HResult=-2147024809
Message=引數無效。
Source=System.Drawing
StackTrace:
在 System.Drawing.Graphics.GetHdc()
在 System.Windows.Forms.Control.DrawToBitmap(Bitmap bitmap, Rectangle targetBounds)
uj5u.com熱心網友回復:
平移截圖是可以的;轉載請註明出處,本文鏈接:https://www.uj5u.com/net/17977.html
標籤:ASP.NET
上一篇:新人問一下,怎么獲得積分??
