GDI+ 图像缩放问题
GDI+ image scaling issue
我有一个应用程序,它使用 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
我会扩展这个测试来绘制一个平滑的"三角形",但线条的大小并不完全符合目标 rect 指定的大小:https://i.stack.imgur.com/Q9rev.png
有什么方法可以解决此行为吗?我需要输出大小完全符合指定大小的位图(考虑源图像 alpha 通道并且边缘没有背景插值)。
PS:我必须使用GDI+,因为实际代码使用gdiplus提供的一些ImageAttributes。
,所以我最终尝试了不同选项的所有可能值,最终找到了适合我的值。
SetSmoothingMode
(如Na Na建议的那样)对图像没有任何视觉效果。
然而,SetInterpolationMode(InterpolationModeBilinear)
(或更好)产生精确的图像大小,但它也会用背景插入图像边缘。结果看起来像这样,不符合我的要求。
最后,设置 ImageAttibute
的 WrapMode
选项可以解决问题:
attrs.SetWrapMode(Gdiplus::WrapModeTileFlipXY);
结果正是我想要的:https://i.stack.imgur.com/umfw3.png
总结:
使用InterpolationModeNearestNeighbor
和默认WrapMode
会导致渲染图像大小不准确。若要避免这种情况,请将 WrapModeTileFlipXY
=> 其他选项(如 InterpolationMode
)可以具有任何所需的值,而不会影响渲染的图像大小。
你试过这个吗?
抗锯齿平滑方法可能会有所帮助。
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 计算缩放多边形的比例,得到给定的多边形面积
- QwtPlot具有相等的轴和自动缩放
- 如何在directx/c++中进行平移/缩放操作
- 在Qt中实现无限可缩放的画布
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何在OpenGL(GLFW,很高兴)中进行2D缩放?
- 改变或缩放两个正态分布以具有特定的相关系数
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何在OpenGL中正确旋转和缩放对象?
- 仅当类型为 std::complex 时,才进行缩放
- 将 VS Code 用于跨平台可缩放C++项目
- 根据帧速率缩放/缩小数字
- 在 c++ 中缩放浮点值
- 如何防止 DirectX C++程序的拉伸/缩放
- 野牛C 解析器缩放问题
- GDI+ 图像缩放问题
- glVertex3f缩放问题