VideoNet程序中,由于图像颠倒且镜像,DrawDibDraw 函数中的 rgbdata参数 如何进行翻转

ljh_0728 2012-08-09 04:22:30

在进行VideoNet的程序(在http://www.codeproject.com/Articles/7573/VideoNetb上下载的)学习中,发现传到远端的图像被颠倒,且镜像(就是说:现在要对该图像进行翻转且镜像,才能达到与原图像相同) ,是否可以在调 DrawDibDraw 函数前对它的参数rgbdata,进行处理,但是如何处理才能达到我的预期呢? 面前我用最简单的 1和end元素交换的方法(参见贴的代码)_,可以得到不翻转的图像,但是镜像问题还存在,且颜色又发生了变化。所以:

(问题1:这种方法是否可行? 如果可行,请告知我该如何翻转)
(问题2:如果不可行,那么我该如何修改这个程序,才能达到我的预期目的 )

    SwapArray(rgbdata, IMAGE_SIZE); 其中 IMAGE_SIZE 为 76032(176*144*3)
1. 函数 ::DrawDibDraw(hdib,
m_Myhdc,
remote_wnd_x, // dest : left pos ,//目的图像的横坐标在客户区的横坐标起始,视口的横坐标起始
remote_wnd_y, // dest : top pos ,//目的图像的纵坐标在客户区的纵坐标起始,视口的纵坐标起始
-1, // don't zoom x (),//目的图像的宽度,视口的图像宽
-1, // don't zoom y 目的图像的高度,视口的图像高
&m_bmpinfo->bmiHeader, // bmp header info ,
rgbdata, // bmp data //整幅图像的数据起始首地
0, // src :left 源图像的横坐标起始,窗口横坐标起
0, // src :top 源图像的纵坐标起始,窗口纵坐标起
IMAGE_WIDTH, // src : width 源图像的宽度,窗口宽
IMAGE_HEIGHT, // src : height 源图像的高度,窗口高
DDF_SAME_DRAW // use prev params....
);

2. 最简单的翻转:
void CVideoNetDlg::SwapArray(unsigned char *pS, UINT dwCount)
{
char temp;
for (UINT i = 0; i < dwCount / 2; i++)
{
temp = pS[i];
pS[i] = pS[dwCount - i -1];
pS[dwCount - i - 1] = temp;
}
}
...全文
547 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljh_0728 2012-08-13
  • 打赏
  • 举报
回复
最后还是从rgb数组上做文章:解决了该问题:该代码的调试过程:http://blog.csdn.net/ljh_0728/article/details/7861927
  还是谢谢楼上两位 zgl7903  ndy_w  的热心帮助,散分各50





/* 函数名称: SwapArrayljh2
/* 参数:unsigned char *pS, long dwCount
ps 数组名 dwcount 数组大小
// 进行交换数组的元素
// R G B R G B ......... (176 个 RGB ) 即:176 * 3 =
// R G B R G B .........
// R G B R G B .........
//.... 共 144 行

// 1) 将最后一行换到第一行, 依次类推;


// 先进行 1) 操作
for (long i = 0; i < dwCount/2; i++)
{
nLineSr = i/nPerLineTotal; // 当前所在行数 0--527 第 0 行;528-1057 第1行
nToSwap = (IMAGE_HEIGHT - nLineSr -1)*nPerLineTotal + (i % nPerLineTotal);

temp = pS[i];
pS[i] = pS[nToSwap];
pS[nToSwap] = temp;
}
ljh_0728 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
GDI+ 保存指定的窗口为JPEG文件(X Y轴镜像功能可选)
[/Quote]

感谢 zgl7903 :按照你的代码,我实现了保存到jpg文件的翻转和镜像.但可惜这不是我的需求。。 因为现在是在我的函数中实时的绘制,要实时的显示远端摄像头的内容,我只需要我摄像头的那一块区域变化。
而你的代码是实现整个屏幕的保存(类似抓屏键),怎样才能达到我的效果呢?
ljh_0728 2012-08-09
  • 打赏
  • 举报
回复
补充说明: 我用 Gdi 的 graghics 也实现了翻转,但是它是对jpg的翻转, 我是将整个屏幕DC 生成一个bmp文件里面去,然后再对这个bmp文件用 Gdi 的 graghics 对它进行翻转。
但我最终是要屏幕上实时显示的区域为翻转后的图像, 这样我所获得的jpg又转到屏幕,很麻烦,也不好实现。 所以我放弃了这条路。 还是想从 rgbdata 这个数组上想办法


HBITMAP aaa1;
pBmp->GetHBITMAP(Color(0,0,0),&aaa1);

CBitmapEx aaBitmapEx;
aaBitmapEx.Load(aaa1);
aaBitmapEx.Save("C:\\aa.jpg");

Graphics graphics(m_Myhdc);
Image image(L"C:\\aa.jpg");
image.RotateFlip(RotateNoneFlipY); // RotateNoneFlipY 刚好是翻转后的效果;
CLSID pngClsid;
GetEncoderClsid(L"image/jpeg", &pngClsid);
image.Save(L"C:\\Mosaic2.jpeg", &pngClsid, NULL);
ljh_0728 2012-08-09
  • 打赏
  • 举报
回复
1. to : ndy_w: 我用过你说的负数,没有达到目的。 用负数后,这边就什么图象也都看不到;
2. to : zgl7903 你说的那个方法, 是不是在 OnPaint 函数中才可以调,我现是在我的回调函数中
有如下代码的, 把你的代码贴进去, rt? 值估计我是没有。 所以我也不知道传什么值给它, 注释掉后, 运行也没有达到目的。
该怎么办呢? 请大家再帮我想想办法? 最好从 rgbdata 这个数组上想办法改变它能达到目的就最好了。 ???
zgl7903 2012-08-09
  • 打赏
  • 举报
回复
用 SetMapMode SetViewportExtEx SetWindowExtEx 镜像DC


case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);

//映射模式
int iMapMode = SetMapMode(hDC, MM_ANISOTROPIC);
SIZE szViewportExt, szWindowExt;
SetViewportExtEx(hDC, -1, //X轴镜像
-1, //Y轴镜像
&szViewportExt);
SetWindowExtEx(hDC, 1, 1, &szWindowExt);

//坐标原点
POINT ptOrg;
SetViewportOrgEx(hDC, rt.right, rt.bottom, //设置为左下角
&ptOrg);

//绘制代码
MoveToEx(hDC, 0, 0, NULL);
LineTo(hDC, 100, 100);
LineTo(hDC, 100, 0);

//恢复映射模式、坐标轴方向及坐标原点
SetMapMode(hDC, iMapMode);
SetViewportExtEx(hDC, szViewportExt.cx, szViewportExt.cy, NULL);
SetWindowExtEx(hDC, szWindowExt.cx, szWindowExt.cy, NULL);
SetViewportOrgEx(hDC, ptOrg.x, ptOrg.y, NULL);

EndPaint(hWnd, &ps);
break;
}
ndy_w 2012-08-09
  • 打赏
  • 举报
回复 1
怀疑你只是上下颠倒了,左右并没有翻转。否则你的办法就灵了。BITMAPINFOHEADER中,biHeight可以为负的,你把它反号看看。

19,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧