用TV卡采集的视频存为bmp时,就一切正常,保存为jpg时图像却变成了倒立的,怎么办?
解决方案 »
- 求一个工作中遇到的难题 曲线的问题
- 请问如何在视图分隔条上添加按钮
- 我在已有的EXE工程里加了一个COM接口,请问如何在别的程序里调用它和它的方法.
- 【公告】没可用分提问技术问题的看过来
- 控件文本的改变问题,谢谢!
- 罕见的难题,CoInitializeSecurity在MFC里不被编译器识别!!救命啊
- 一个类的默认构造函数不初始化它的数据成员,行吗?会有什么样的后果?
- 怎样在打开的文件中读出一个一个的字符串
- vc如何是实现简单的发牌以及通过鼠标单击来出牌
- 这种错误提示该怎么解决?(立结)
- Debug版本正常,Release版本部分界面不刷新显示,显示了它的背景!
- 请问如何通过串口读写UNICODE码?
原因是:bmp图存储数据是倒过来的,JPG应该不是。所以处理bmp时需要把数据倒过来读,即从最后一行。JPG应该不是这样的,所以两种格式是不同的,如果你用同一种方式处理,必然有一个会是反的。既然bmp正立了,那jpg就倒立了。
HRESULT hr=pGrabber->GetCurrentBuffer(&cbBuffer,NULL);
BYTE *pBuffer=new BYTE[cbBuffer];
hr=pGrabber->GetCurrentBuffer(&cbBuffer,(long*)pBuffer);
//pBuffer中有实时抓的图数据
//下面是存为JPG时调用的函数,应该怎样改才能把图像正过来BOOL wjf(LPCSTR lpstrFileName,BYTE *dataBuf,UINT widthPix,UINT height,BOOL color,int quality)
{
if (dataBuf==NULL)
return FALSE;
if (widthPix==0)
return FALSE;
if (height==0)
return FALSE; LPBYTE tmp;
if (!color)
{
tmp = (BYTE*)new BYTE[widthPix*height];
if (tmp==NULL)
{
m_strJPEGError = "Memory error";
return FALSE;
} UINT row,col;
for (row=0;row<height;row++)
{
for (col=0;col<widthPix;col++)
{
LPBYTE pRed, pGrn, pBlu;
pRed = dataBuf + row * widthPix * 3 + col * 3;
pGrn = dataBuf + row * widthPix * 3 + col * 3 + 1;
pBlu = dataBuf + row * widthPix * 3 + col * 3 + 2; // 计算图像亮度值
int lum = (int)(.299 * (double)(*pRed) + .587 * (double)(*pGrn) + .114 * (double)(*pBlu));
LPBYTE pGray;
pGray = tmp + row * widthPix + col;
*pGray = (BYTE)lum;
}
}
}
//定义压缩信息
struct jpeg_compress_struct cinfo;
//定义缓冲区
FILE * outfile;
int row_stride;
//定义错误信息
struct my_error_mgr jerr; //为JPEG文件压缩对象分配内存并对其初始化
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_compress(&cinfo);
fclose(outfile); if (!color)
{
delete [] tmp;
}
return FALSE;
}
jpeg_create_compress(&cinfo);
//打开文件并设定数据目标
if ((outfile = fopen(lpstrFileName, "wb")) == NULL)
{
char buf[250];
sprintf(buf, "JpegFile :\nCan't open %s\n", lpstrFileName);
m_strJPEGError = buf;
return FALSE;
} jpeg_stdio_dest(&cinfo, outfile);
//设置压缩参数
cinfo.image_width = widthPix;
cinfo.image_height = height;
if (color)
{
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
}
else
{
cinfo.input_components = 1;
cinfo.in_color_space = JCS_GRAYSCALE;
} jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE );
//开始压缩
jpeg_start_compress(&cinfo, TRUE);
//写入扫描线
row_stride = widthPix * 3; while (cinfo.next_scanline < cinfo.image_height)
{
LPBYTE outRow;
if (color)
{
outRow = dataBuf + (cinfo.next_scanline * widthPix * 3);
}
else
{
outRow = tmp + (cinfo.next_scanline * widthPix);
} (void) jpeg_write_scanlines(&cinfo, &outRow, 1);
}
//完成压缩 jpeg_finish_compress(&cinfo);
fclose(outfile);
//释放压缩对象
jpeg_destroy_compress(&cinfo); if (!color)
delete [] tmp;
return TRUE;
}
把这种循环倒过来试试。从height开始,减到0为止
{
for (col=0;col<widthPix;col++)
这两个循环都倒过来不行么?
{
for(col=widthPix-1;col>=0;col--)不行,我改成上面那样,结果还是一样没有变化
{
for (col=0;col<widthPix;col++)
{
和
LPBYTE pGray;
pGray = tmp + row * widthPix + col;
*pGray = (BYTE)lum;
这两部分改任何一部分。如果上面改为
for(row=heiht-1;row>=0;row--)
{
for(col=widthPix-1;col>=0;col--)
,那么下面就应该是
LPBYTE pGray;
pGray = tmp + (height - row) * widthPix + (width - col);
*pGray = (BYTE)lum;
LPBYTE pGray;
pGray = tmp + (height - row) * widthPix + (width - col);
*pGray = (BYTE)lum;
这样才能倒过来。
for(row=height-1;row>=0;row--)
//for(row=0;row<height;row++)
{
for(col=widthPix-1;col>=0;col--)
//for(col=0;col<widthPix;col++)
{
LPBYTE pRed, pGrn, pBlu;
pRed = dataBuf + row * widthPix * 3 + col * 3;
pGrn = dataBuf + row * widthPix * 3 + col * 3 + 1;
pBlu = dataBuf + row * widthPix * 3 + col * 3 + 2; // 计算图像亮度值
int lum = (int)(.299 * (double)(*pRed) + .587 * (double)(*pGrn) + .114 * (double)(*pBlu));
LPBYTE pGray;
//pGray = tmp + row * widthPix + col;
pGray=tmp+(height-row)*widthPix+(widthPix-col);
*pGray = (BYTE)lum;
}
}
for(row=height-1;row>=0;row--)
{
for(col=0;col<widthPix;col++)
{
LPBYTE pRed, pGrn, pBlu;
pRed = dataBuf + row * widthPix * 3 + col * 3;
pGrn = dataBuf + row * widthPix * 3 + col * 3 + 1;
pBlu = dataBuf + row * widthPix * 3 + col * 3 + 2; // 计算图像亮度值
int lum = (int)(.299 * (double)(*pRed) + .587 * (double)(*pGrn) + .114 * (double)(*pBlu));
LPBYTE pGray;
pGray=tmp+(height-row-1)*widthPix+col;
*pGray = (BYTE)lum;
}
}如果这还不行,那就是其它方面的问题了。