簡體   English   中英

C#中閃爍的圖像

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM