none
使用DrawImage放大圖片,但放大圖片的右側與下方卻出現空白像素行列? RRS feed

  • 問題

  • 最近在使用DrawImage放大圖片,程式碼如下:

      oldrect = New Rectangle(0, 0, 50, 40)
            newrect = New Rectangle(0, 0, 400, 320)
            nowbmp = New Bitmap(400, 320)
            g1 = Graphics.FromImage(nowbmp)
            g1.Clear(Color.Green)
            g1.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor

               g1.DrawImage(basebmp, newrect, oldrect, GraphicsUnit.Pixel)

    得到如下圖

    綠色部分是空白像素。

    為什麼會產生這種情形?該如何改正呢?

    謝謝。

    2016年10月29日 下午 01:54

解答

  • 這篇文章對你有幫助,主要是要給予 Wrap Mode

    https://blog.mariusschulz.com/2014/05/28/preventing-ghost-borders-when-resizing-images-with-system-drawing

    using (var graphics = Graphics.FromImage(resizedImage))
    {
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
        var attributes = new ImageAttributes();
        attributes.SetWrapMode(WrapMode.TileFlipXY);
    
        var destination = new Rectangle(0, 0, targetWidth, targetHeight);
        graphics.DrawImage(image, destination, 0, 0, image.Width, image.Height, 
            GraphicsUnit.Pixel, attributes);
    }


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    • 已標示為解答 sel0918 2016年11月7日 上午 08:26
    2016年11月2日 上午 06:20

所有回覆

  • basebmp 有透明色嗎?

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年10月29日 下午 05:10
  • basebmp沒有透明色。

    它就是一張50*40的黑色圖片,四周為各有一個紅色點(都佔一個像素)。

    此外,我是使用VB2008。

    2016年10月30日 上午 01:03
  • 這篇文章對你有幫助,主要是要給予 Wrap Mode

    https://blog.mariusschulz.com/2014/05/28/preventing-ghost-borders-when-resizing-images-with-system-drawing

    using (var graphics = Graphics.FromImage(resizedImage))
    {
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
        var attributes = new ImageAttributes();
        attributes.SetWrapMode(WrapMode.TileFlipXY);
    
        var destination = new Rectangle(0, 0, targetWidth, targetHeight);
        graphics.DrawImage(image, destination, 0, 0, image.Width, image.Height, 
            GraphicsUnit.Pixel, attributes);
    }


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    • 已標示為解答 sel0918 2016年11月7日 上午 08:26
    2016年11月2日 上午 06:20
  • 感謝大大的回覆,受益良多。

    根據您的意見,重新整理過程式後,得到如下圖

    確實沒有空白像素了。但細看圖形的最上與最左的紅點,卻沒有8個像素(放大8倍),只有4個。

    而最下與最右的紅點卻有12個像素。有些變形了。

    可否還有其他方法,不會產生這種情形呢?

    2016年11月2日 上午 09:31