none
C# 使用new Bitmap(bmp, newWidth, newHeight)放大圖片時,圖片產生模糊失真 (求解) RRS feed

  • 問題

  • 關於這個問題,我想過很多的可能性,最後都撞牆...

    在這邊簡述一下問題:

    我用 Bitmap 宣告了一張圖,使用 SetPixel 的方式,針對每個點給定 Pixel 值

    但在使用 New Bitmap(Bitmap, newWidth, newHeight) 圖片後,圖片中,顏色交界處產生模糊的現象 (失真)

    爬文爬了一陣子了,嘗試過不同的繪圖法,Gaphic 的屬性(調整畫質等等)設定也嘗試過,但都沒有改善

    接著我將圖輸出存成 bmp 檔,並使用 windows 相片檢視器開啟

    用 windows 相片檢視器中的放大功能檢視圖片,倍率放到最大的時候每個Pixel值還是可以呈現完整且清楚的正方形

    由此就在猜測有可能不是圖片本身的問題 (只是猜測)

    接著我猜想,有可能是在放大圖片的時候 Pixel 個數沒有對應到相對的倍數(例如原本x軸有20個點,標放大到43個點)

    假想可能因此產生模糊的現象 (顏色漸層)

    然後我做了一個簡單的測試

    Bitmap bmp = new Bitmap(2, 1);
    bmp.SetPixel(0, 0, Color.Red);
    bmp.SetPixel(1, 0, Color.Blue);

    原始圖我設計只給定2個 Pixel 空間,並各別填入紅色和藍色

    接著我將此圖放大100倍 (指令如下),每個顏色應該擁有 100x100 的 Pixel 數,排除沒對應到相對倍數的問題

    pictureBox1.Image = new Bitmap(bmp, 200, 100);

    結果更讓我震驚的事情發生了...

    輸出的圖形為很美的漸層(由左至右為"紅,藍,白", 由上至下為"原色,白色")

    是很誇張的漸層 (抱歉,權限的問題沒辦法貼圖)

    討論:

    1. 為什麼左邊和上面的邊緣都是呈現原色,而右邊和下面的邊緣卻呈現白色

    2. 誇張的漸層已遠超過原本預想的可接受範圍

    接著我試著將放大的Size加減1~3,結果都為相同的結果

    目前猜想是系統會自動對圖片做平滑 (smooth) 的?

    問題可能有點笨拙,但希望這邊的高手能為我解惑

    謝謝。

    p.s.

    如果對於這個問題我已經想出了解答,我也會PO上來供大家參考

    爬了很多文,好像這個問題還沒有一個明確的解答

    2014年1月23日 上午 10:58

解答

  • 謝謝提供資訊的各位,真的非常感謝

    我已經試出解決的方法了,也供大家參考

    由於在resize的時候圖片模糊掉,我太執著於要"提高畫質"才不會"失真"

    但其實就是圖片被模糊化了所以才失真

    經由大家所提供的連結結果圖中觀察到

    e.Graphic.InterpolationMode = InterpolationMode.NearestNeighbor;

    反而將畫直到最低才會呈現類似馬賽克的畫質

    這才是我想要的最真實的圖形

    但圖形放大後,感覺整個圖往上和右位移了半個畫格

    推敲出比如說(0,0)給一個Pixel為2x2的顏色

    那他會以中心展開(確實也比較合理),填色範圍(-1~1, -1~1)

    因此看起來才向是位移了半個畫格,但這樣的圖也比較正確

    想要觀看全圖,之後自己再做一些調整就可以解決了



    • 已編輯 Shake Hsieh 2014年1月24日 上午 02:19
    • 已標示為解答 Shake Hsieh 2014年1月24日 上午 02:20
    2014年1月24日 上午 02:19

所有回覆