用TV卡采集的视频存为bmp时,就一切正常,保存为jpg时图像却变成了倒立的,怎么办?

解决方案 »

  1.   

    倒立的倒立就是正立。把图像再倒一下就行了。具体就是最后一行的数据放到第一行。
    原因是:bmp图存储数据是倒过来的,JPG应该不是。所以处理bmp时需要把数据倒过来读,即从最后一行。JPG应该不是这样的,所以两种格式是不同的,如果你用同一种方式处理,必然有一个会是反的。既然bmp正立了,那jpg就倒立了。
      

  2.   

    //下面是存为JPG时调用的函数,应该怎样改才能把图像正过来long cbBuffer=0;
    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;
    }
      

  3.   

    for (row=0;row<height;row++) 
    把这种循环倒过来试试。从height开始,减到0为止
      

  4.   

    for (row=0;row<height;row++) 
    {
    for (col=0;col<widthPix;col++) 
    这两个循环都倒过来不行么?
      

  5.   

    for(row=heiht-1;row>=0;row--)
    {
     for(col=widthPix-1;col>=0;col--)不行,我改成上面那样,结果还是一样没有变化
      

  6.   

    for (row=0;row<height;row++) 
    {
    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;
      

  7.   

    说错了,应该是,不管上面有没有改,下面应该用:
    LPBYTE pGray;
    pGray = tmp + (height - row) * widthPix + (width - col);
    *pGray = (BYTE)lum;
    这样才能倒过来。
      

  8.   

    还是不行,我改成下面的样子,结果还是相同
    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;
    }
    }
      

  9.   

    嗯。有些毛病,列不用倒置。
                      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;
    }
    }如果这还不行,那就是其它方面的问题了。
      

  10.   

    呵呵,又看到这位兄弟的帖子了,靠,jpg还没有搞定啊,找我啊,我最近一直在写静态图像