我有一个应用程序,使用gdi+从某些位图中绘制背景。其中一些位图是垂直非线性渐变(例如,它们的宽度为1像素,应该在水平方向上拉伸以填充整个控件宽度)。
问题在于,对于小图像(如上所述),右侧的一些控件区域没有被绘制。
我编写了一个测试程序,将1x1图像缩放到不同的大小,结果显示当缩放因子足够大时会出现此问题。
void Draw(HDC hDestDC, int destleft, int desttop, int destwidth, int destheight)
{
COLORREF buffer[] = {0xFF0000FF }; // 1 pixel image
const int width = 1, height = 1;
Gdiplus::Bitmap gdipBitmap(width, height, 4*width, PixelFormat32bppARGB, (BYTE*)buffer);
Gdiplus::ImageAttributes attrs;
Gdiplus::Rect dest(destleft, desttop, destwidth, destheight);
Gdiplus::Graphics graphics(hDestDC);
graphics.SetInterpolationMode(Gdiplus::InterpolationModeNearestNeighbor);
graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);
graphics.DrawImage(&gdipBitmap, dest, 0, 0, width, height, Gdiplus::UnitPixel, &attrs);
}
// OnPaint:
for(int i=0; i<800; ++i)
Draw(hdc, 0, i, i, 1); // scale 1x1 image to different width
我期望这个测试可以画出一个平滑的“三角形”,但是实际上线条的大小并不完全符合目标矩形的规定: http://i.imgur.com/NNpMvmW.png 有没有办法修复这种行为?我需要输出大小完全符合规定的位图(考虑源图像的 alpha 通道,边缘不与背景插值)。
P.S:我必须使用 GDI+,因为实际代码使用了 gdiplus 提供的一些 ImageAttributes。