• 11403阅读
  • 12回复

[提问]【已解决】如何将Int数组的内容显示为图片? [复制链接]

上一主题 下一主题
离线yzpdsg
 

只看楼主 倒序阅读 楼主  发表于: 2011-03-29
我从一个二进制文件读入的值作为图片的灰度值,存在一个int pixmap[]数组里。如何利用这些灰度值显示一幅图片呢?

这是我读数的代码:

    int count = 0;
    FILE *fp;
    if((fp = fopen(filePath.toAscii().constData(),"rb+")) == NULL)
        return -1;
    while(!feof(fp))
    {
        fread(pixmap+count,1,1,fp);
        count++;
    }
[ 此帖被yzpdsg在2011-03-31 16:58重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2011-03-29
可以考虑QImage的  Index8格式
离线yzpdsg

只看该作者 2楼 发表于: 2011-03-29
回 1楼(dbzhang800) 的帖子
感谢你的回复。我是个新手,请稍微详细一点,谢谢!
离线roywillow

只看该作者 3楼 发表于: 2011-03-29
总之你得先知道怎么将这些灰度值转换为具体像素的像素值,这个就看你要用什么格式的QImage了
然后创建一个相同大小的QImage,利用QImage的scanLine之类的函数获得每行的字节数据的指针,然后直接对这些数据修改,这个要比QImage的某个设定像素的函数效率高似乎
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线yzpdsg

只看该作者 4楼 发表于: 2011-03-29
回 3楼(roywillow) 的帖子
说实话,没太理解(汗),不好意思。我刚才看到QByteArray可以支持二进制数据,而且似乎显示图片很方便:
QSqlQuery query_pict;
data = query_pict.value(0).toByteArray();//数据库中的图片不就是以二进制存储的么?
QImage photo;
photo.loadFromData(data);
ui->label->setPixmap(QPixmap::fromImage(photo));

这样就行了。那么是不是就是说我把Int数组的内容转换成QVariant就行了?
离线roywillow

只看该作者 5楼 发表于: 2011-03-29
如果数据库中存储的数据是个完整的规范图片文件,比如就是个png文件,那么用你的做法读取应该没问题
但是如果只是存储的一些信息,当然得要求你自己处理了
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线yzpdsg

只看该作者 6楼 发表于: 2011-03-29
回 5楼(roywillow) 的帖子
我的图片已经是黑白的了,读出的数值就是灰度值,那么还用处理么?
离线roywillow

只看该作者 7楼 发表于: 2011-03-29
读出来的是一串灰度值总得把它们转换成QImage能显示的像素吧
灰度如果在256个梯度内或许可以用Index8,那个的colorTable应该最多支持256中颜色吧

我只做过把灰度值转换为alpha值的处理,不过感觉应该差不多
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线yzpdsg

只看该作者 8楼 发表于: 2011-03-30
回 7楼(roywillow) 的帖子
哦,原来是这样!我明白了。

我今天想到一个问题,可不可以把读入的数存入一个文件,在这个文件头写入常见图片的格式信息,这样就会被认为是一幅正常图片了,再用QLabel显示出来。不知这样可以么?
离线downstairs

只看该作者 9楼 发表于: 2011-03-30
QImage读入QByteArray转换。
喜爱编程的猫头鹰
离线roywillow

只看该作者 10楼 发表于: 2011-03-30
如果你能给添加上一些符合标准的头当然可以……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线yzpdsg

只看该作者 11楼 发表于: 2011-03-31
回 9楼(downstairs) 的帖子
那是不是要把int数组转换成QByteArray呢?
离线yzpdsg

只看该作者 12楼 发表于: 2011-03-31
哇塞,我做到了!!!好兴奋!!!谢谢诸位!!!原来很简单!

    QImage image(pixmap,WIDTH,HEIGHT,QImage::Format_Indexed8);
    QVector<QRgb> colorTable;
    for(int i = 0; i < 256; i++)
    {
        colorTable.push_back(qRgb(i,i,i));
    }
    image.setColorTable(colorTable);
    QPixmap pm = QPixmap::fromImage(image);
    ui->label_5->setPixmap(pm);//搞定!!!

再次谢谢诸位耐心的解答!!!!

快速回复
限100 字节
 
上一个 下一个