2012-01-22 54 views
1

我一直在试图改变我的照片的大小。我看了很多网站:12,3Winforms清除位图图像?

最后一个链接(3)至少会调整图像的大小,除了旧图像保留在调整后的图像之外。这是怎么发生的?为什么?如果我将winform最小化,然后将winform备份起来,则旧图像消失了,剩下的只是调整后的版本。我如何摆脱旧的形象?

任何想法?

+0

你的调整大小的方法没有任何问题。 – doogle

+2

*从不*使用CreateGraphics(),它不会正确地清除背景,并且您绘制的任何内容都将很容易消失。实施Paint事件,并使用传递的e.Graphics。您的Click事件应调用Invalidate()来触发绘画。 –

+0

也许你可以发布代码示例,以便我们可以看到你在做什么。 –

回答

1

C# Tutorial - Image Editing: Saving, Cropping, and Resizing的第一个链接给你的代码。

有没有理由不使用它?

private static Image resizeImage(Image imgToResize, Size size) 
{ 
    int sourceWidth = imgToResize.Width; 
    int sourceHeight = imgToResize.Height; 

    float nPercent = 0; 
    float nPercentW = 0; 
    float nPercentH = 0; 

    nPercentW = ((float)size.Width/(float)sourceWidth); 
    nPercentH = ((float)size.Height/(float)sourceHeight); 

    if (nPercentH < nPercentW) 
     nPercent = nPercentH; 
    else 
     nPercent = nPercentW; 

    int destWidth = (int)(sourceWidth * nPercent); 
    int destHeight = (int)(sourceHeight * nPercent); 

    Bitmap b = new Bitmap(destWidth, destHeight); 
    Graphics g = Graphics.FromImage((Image)b); 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
    g.Dispose(); 

    return (Image)b; 
} 

不要忽视InterpolationMode。它会使图像更好看。

此外,我不认为你想在这种情况下使用CreateGraphics()。您可能想要使用实际位图来存储调整大小的图像,或者仅使用要显示图像的控件的绘制事件中的对象Graphic

+0

我已经尝试将其添加到我的代码中,但它不会工作,我不得不确保StartPainting获取返回的图像(如果我这样做,它编译并运行没有错误,但图像不会更改大小?(不知道为什么)..... – BigBug

+0

@BlueMonster你的原始图像是什么?它看起来像你试图从控件调整图像大小,而不是原始位图。 – LarsTech

+0

我有一个图像使用OpenFileDialog ...我玩的位来改变它的颜色等我使用位图...玩颜色我必须锁定图像到内存然后我解锁使用“UnlockBits()”,似乎都是工作正常......它只是调整大小,我不知道如何去玩比赛来调整我的形象? – BigBug