要重現此問題,請在Microsoft Paint中創建一個2x2像素黑色圖像,並保存爲D:\small.png
。然後在Visual Studio中創建一個新的WinForms應用程序,並帶有無邊距的PictureBox。然後使用下面的代碼:我遇到意外的結果Graphics.DrawImage
void f6(Graphics g)
{
var img = Image.FromFile(@"d:\small3.png");
var srcRect = new Rectangle(0, 0, img.Width, img.Height);
int factor = 400;
var destRect = new Rectangle(0, 0, img.Width * factor, img.Height * factor);
g.DrawRectangle(new Pen(Color.Blue), destRect);
g.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);
}
void pictureBox1_Paint(object sender, PaintEventArgs e)
{
f6(e.Graphics);
}
我希望藍邊距之內的整個矩形是黑色的,而輸出如下:
這究竟是爲什麼?
好的,謝謝。我不知道插值。現在,讓我們來改變代碼如下:
void f6(Graphics g)
{
var img = Image.FromFile(@"d:\small3.png");
var srcRect = new Rectangle(0, 0, img.Width, img.Height);
int factor = 200;
var destRect = new Rectangle(0, 0, img.Width * factor, img.Height * factor);
g.FillRectangle(new SolidBrush(Color.DarkCyan), pictureBox1.ClientRectangle);
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.DrawRectangle(new Pen(Color.Blue), destRect);
g.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);
}
它產生以下結果:
這仍然是不能接受的。 我也嘗試過60x60圖片。這個問題並不是因爲它是一張2x2圖片。它們產生相同的效果。問題是爲什麼GDI +決定不用整個srcRect填充整個destRect?! 原來的問題是,我有一個大的圖像平鋪在較小的。我需要相鄰的瓷磚既不重疊也不接縫。在C++中,StretchBlt可以正常工作。但它不會產生平滑的拉伸圖像。
我已將您的後續帖子合併到此問題的*編輯* – 2012-04-11 07:38:00