zxphxh 2022-01-17 21:33 采纳率: 40%
浏览 14
已结题

GDI+想实现图层合并功能,y轴反向,两个Bitmap合并,怎么结果y轴相反?

想实现图层合并功能,在内存中生成两个Bitmap对象bmp1、bmp2,及相应的Graphics对象g1、g2,y轴均是反向的,分别用g1和g2绘图,然后把bmp2的图像绘制到bmp1上,实现图层合并功能,但bmp1上会制的图像形状都正确,bmp2上绘制的图像却是y轴向下的,是什么原因?
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc) return;

CRect rc;
GetClientRect(&rc);
INT w = rc.Width();
INT h = rc.Height();

Bitmap bmp1(w, h);
Graphics g1(&bmp1);
g1.MultiplyTransform(&Matrix(1, 0, 0, -1, 0, 0));//y反向
g1.TranslateTransform(0, -h);//左下角为原点
Pen pen1(Color(255,255,0,0), 5);// 红色线段
g1.DrawLine(&pen1, 0.0f,0.0f, 200.0f, 200.0f);

Bitmap bmp2(w, h);
Graphics g2(&bmp2);
g2.MultiplyTransform(&Matrix(1, 0, 0, -1, 0, 0));//y反向
g2.TranslateTransform(0, -h);//左下角为原点
Pen pen2(Color(255,0,0,255), 5); // 蓝色线段
g2.DrawLine(&pen2, 100.0f, 0.0f, 300.0f, 200.0f);//与bmp1直线比,向右漂移100

g1.DrawImage(&bmp2, 0, 0);//把bmp2绘制到bmp1上,实现图层合并功能

// 显示合并后的图像。
// 理想是在左下角实现红色线和蓝色线平行的,但是结果却是蓝色线显示在了左上角向右平移100的位置,
// 也即是bmp2没有实现y轴反向,坐标原点仍然在左上角
Graphics g(pDC->m_hDC);  
CachedBitmap DestBMP1(&bmp1, &g);
g.DrawCachedBitmap(&DestBMP1, 0, 0);

// 但是重复上面的过程,就可以实现两条直线平行的效果。但这种方法不是想要的。
//CachedBitmap DestBMP2(&bmp2, &g);
//g.DrawCachedBitmap(&DestBMP2, 0, 0);
// 请问是什么原因,蓝色线绘制在左上角了?图层合并的功能如何实现?谢谢
}

  • 写回答

2条回答 默认 最新

  • zxphxh 2022-01-17 21:46
    关注

    // 利用容器,实现区域变换,可以实现图层合并。不知道上面的为何出现bmp2在bmp1上是y轴方向相反的?
    RectF R(0,0,w,h);
    Gdiplus::RectF dest(R.X, R.GetBottom(), R.Width, -R.Height);
    Gdiplus::GraphicsContainer container = g1.BeginContainer(dest, R, Gdiplus::UnitPixel);// :UnitPoint);
    g1.DrawImage(&bmp2,0,0);
    g1.EndContainer(container);

    评论

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 创建了问题 1月17日

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站