[英]Flickering Image in C#
我有一些代碼可以將圖像呈現為表單並使用軌跡欄來旋轉該圖像。 該代碼取自你管教程並且有效。 但是,當圖像旋轉時,它會閃爍。 教程海報說使用線程將消除閃爍,但我不知道如何去做。 任何幫助將不勝感激。 代碼如下:
public partial class Form1 : Form
{
Image img;
int angle;
public Form1()
{
InitializeComponent();
}
Thread th;
Graphics graphicToDraw;
Graphics graphicToScreen;
Bitmap bmp;
private void Form1_Load(object sender, EventArgs e)
{
img = Image.FromFile(@"c:\images\clock face with second hand 2.png");
}
private void Form1_Paint(object sender, PaintEventArgs paint)
{
bmp = new Bitmap(img.Width / 2, img.Height / 2);
graphicToDraw = Graphics.FromImage(bmp);
graphicToDraw.TranslateTransform(bmp.Width / 2, bmp.Height / 2);
graphicToDraw.RotateTransform(angle);
graphicToDraw.TranslateTransform(-bmp.Width / 2, -bmp.Height / 2);
graphicToDraw.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphicToDraw.DrawImage(img, 0, 0);
paint.Graphics.TranslateTransform(this.Width / 2, this.Height / 2);
paint.Graphics.DrawImage(bmp, -bmp.Width / 2, -bmp.Height / 2);
Debug.WriteLine("image width = " + bmp.Width);
Debug.WriteLine("image height = " + bmp.Height);
}
private void Form1_Resize(object sender, EventArgs e)
{
Invalidate();
}
private void trackBar1_ValueChanged(object sender, EventArgs e)
{
angle = trackBar1.Value;
Invalidate();
}
}
在這里使用線程可能是錯誤的方法。 請參閱如何:使用表單和控件的雙緩沖減少圖形閃爍。 即為您的表單或控件設置DoubleBuffered 為true。
DoubleBuffered = true;
您不能使用任何后台線程繪制到 UI。 只允許 UI 線程訪問任何 UI 類,並且始終在 UI 線程上調用繪制事件。 您可以使用后台線程對緩沖區進行中間繪圖。 但據我所知,這完全沒有必要,您應該在圖形對象上設置所需的任何變換並直接繪制到它,不需要中間緩沖區。 如果您確實使用了中間緩沖區,請確保正確處理所有內容。
這種背景緩沖區可能有用的主要情況是,如果您有很多復雜的繪圖要做,並且您只需要不經常更新緩沖區。 然后在后台線程上對該緩沖區進行繪圖可能是有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.