簡體   English   中英

將旋轉的圖像直接繪制到Graphics對象,而無需創建新的位圖

[英]Draw a rotated image directly to Graphics object, without creating a new Bitmap

我可以通過在單獨的圖形對象上進行繪制來旋轉圖像,該圖形對象在單獨的Bitmap上進行繪制,然后在圖形對象上繪制位圖,從而在最終圖像上進行繪制。 這將繪制兩個基本相同的圖像。 我不想要那個。 該項目是一個簡單的圖形引擎,因此繪制時間必須盡可能快。 最重要的是,尚未證明System.Graphics在繪制圖像方面太擅長。

這是我正在使用的代碼。 它需要改進一兩個,但是基本方法應該是可見的。

    public static System.Drawing.Bitmap rotatedImage(System.Drawing.Bitmap img, double deg, bool hq)
    {
        int diag = (int)Math.Round(Math.Sqrt(img.Width * img.Width + img.Height * img.Height));
        System.Drawing.Bitmap res = new System.Drawing.Bitmap(diag, diag);
        System.Drawing.Graphics gfx = System.Drawing.Graphics.FromImage(res);
        if (hq) gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        DoublePair rotCent = new DoublePair(diag / 2, diag / 2);
        gfx.TranslateTransform((float)rotCent.a, (float)rotCent.b);
        gfx.RotateTransform((float)deg);
        gfx.TranslateTransform((-1) * (float)rotCent.a, (-1) * (float)rotCent.b);
        gfx.DrawImage(img, (diag - img.Width) / 2, (diag - img.Height) / 2, img.Width, img.Height);
        return res;
    }

在新的位圖上繪制旋轉的圖像需要旋轉用於繪制的圖形對象。 我可以做的是將主要圖形對象傳遞給該方法,旋轉它以繪制圖像,然后將對象旋轉回去。 但是我不知道旋轉大圖像的圖形是否比旋轉小圖像的圖形更快或更慢。

那么,哪一個會更快-將整個圖形對象旋轉兩次(旋轉以繪制圖像,然后向后旋轉),或者使用單獨的圖形繪制旋轉的圖像,然后與主圖形對象一起繪制呢? 是否可以選擇旋轉圖像而不必使用單獨的圖形對象並且不必旋轉圖形對象?

我在上一個項目中所做的就是這個,它在Paint事件內部,您不需要創建新的位圖,只需重置變換並再次繪制圖像即可:

e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(Width/2, Height/2);
e.Graphics.RotateTransform(45f);  //45 degree
e.Graphics.DrawImage(.... //original image

e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(Width/2, Height/2);
e.Graphics.RotateTransform(60f);  //60degree
e.Graphics.DrawImage(.... //original image
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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