• 5471阅读
  • 3回复

Rgb24 、Gray8  转换问题 [复制链接]

上一主题 下一主题
离线icyrat
 

只看楼主 倒序阅读 楼主  发表于: 2011-11-23
关键词: QByteArrayba;
我要把jpeg图片转换成8位灰度图片,然后得到灰度的纯数据,然后再将8位灰度的纯数据构造一个QImage 保存成jpeg图片,其实就是:
jpg->gray 8->得到纯数据(处理这些数据) ->保存成jpg
我的问题是,有的图片可以走通,但是有的图片不可以,可能跟图片尺寸、数据位对齐有关系,但是我不明白,那个明白啊。
下面的代码对于有的分辨率可以 但是有的则不行,可以的有:1832 * 1120、1024 * 768、640 * 480 、1600 * 960                                           不可以的有:1600 * 1200 、1131 * 707 、500 * 500 、1936 * 2592谁知道为什么????
      
错误信息:
   QVector<QRgb> colorTable;  
   for(int k=0;k<256;++k)    
   {        
           colorTable.push_back( qRgb(k,k,k) );    
    }        
    QImage m("r1.jpg");  // 要转换的24rgb  
    m = convertToGray(m); //实现代码在下面 把24位转8位灰度    
    m.setColorTable(colorTable);    //将灰度数据写入文件    


    QFile bb("r1.dat");
    bb.open(QIODevice::WriteOnly);  
    ba = (const char *)m.bits(); //得到灰度数据  
    bb.write(ba);    
    bb.close();    


    QFile hhh("r1.dat");  
    hhh.open(QIODevice::ReadOnly);  
    ba = hhh.readAll();    //利用灰度数据构造jpg图片    


    QImage iii;
     iii = QImage((uchar *)ba.data(), 1832, 1120, 1832,QImage::Format_Indexed8);    
     iii.setColorTable(colorTable);      
     iii.save("r1con.jpg");


    //转为灰度图
    QImage Widget::convertToGray(QImage rgbImage)
    {
        QSize size=rgbImage.size();    
        QImage grayImage(size,QImage::Format_Indexed8);  
        int width=size.width();
        int height=size.height();  
        uchar * rgbImageData=rgbImage.bits();    
        uchar * grayImageData=grayImage.bits();  
        /*if(rgbImage.isGrayscale())
         {    
                  qDebug()<<"Image is already gray!Conversion stopped!";        
                  return rgbImage;  
           }    */    //若width不是4的倍数,会自动添加字节,使之对齐到4的倍数  
          int realWidth1=rgbImage.bytesPerLine();  
          int realWidth2=grayImage.bytesPerLine();    
  
          uchar * backup1=rgbImageData;  
          uchar * backup2=grayImageData;    //直接取用green绿色分量值作为gray索引值  
         for(int i=0;i<height;  i++,   rgbImageData=backup1+realWidth1*i,   grayImageData=backup2+realWidth2*i)
          {        for(int j=0;j<width;j++)
                   {    
                       *grayImageData=*(rgbImageData+1);
                        rgbImageData+=4;  
                        grayImageData++;
                    }  
           }    
           QVector<QRgb> grayColorTable;  
            uint rgb=0;    
            for(int i=0;i<256;i++)
            {
                   grayColorTable.append(rgb);    
                   rgb+=0x00010101;//r,g,b值分别加1,a值不变,见QRgb说明
             }
             grayImage.setColorTable(grayColorTable);  
             return grayImage;
    }


r1.jpg                                                                            r1con.jpg
[attachment=7190][attachment=7190]


离线roywillow

只看该作者 1楼 发表于: 2011-11-23
不好意思代码好像乱了哦
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线icyrat

只看该作者 2楼 发表于: 2011-11-23
还有这种情况(貌似是dat文件数据不全):

离线roywillow

只看该作者 3楼 发表于: 2011-11-23
Re:Rgb24 、Gray8  转换问题
那个dat文件是留作他用的是吗?
至于获取每一行的数据,我更倾向于用scanLine,之后将返回的值强制转换为QRgb*,就能顺利获得每个像素的值了,并且不用考虑大小端问题,但是好像得考虑一下存储的格式问题。你的代码中似乎还要计算每一行的起始,感觉这里可能会比较容易出问题。
qGray可以直接获取灰度值。
另外如果不是很特别需要效率的话,用pixel()获取每个像素值应该会更方便。


提一个建议,就是传递QImage的时候用const QImage&
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个