Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182912
  • 博文数量: 41
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-23 21:42
文章分类

全部博文(41)

文章存档

2008年(41)

我的朋友

分类: LINUX

2008-11-19 10:53:50

在Qt中如何加载图像以及保存图像到数据库中

先前写过一个在PHP中往数据库中保存图像以及如何读取显示出来:
http://www.qtcn.org/blog/blog.php?do-showone-itemid-479-type-blog.html

现在遇到了在Qt中把图像保存到数据库中(以BLOB类型保存)的问题,这里总结一下,供各位朋友参考

基本的思想和前面的使用PHP保存头像是一样的,这里以例子解说
1、加载一个头像到界面上显示出来(labelZhaoPian的大小是80x96)
  显示头像,这里用QLabel来显示,代码如下:

  extern QString g_strCurrentDir;
  QString strImage = QFileDialog::getOpenFileName(this, "请选择照片文件", g_strCurrentDir, "图像文件 (*.png *.jpg *.bmp *.gif)");
  if (strImage.isNull())
  {
    return;
  }
  g_strCurrentDir = QDir(strImage).absolutePath();
  labelZhaoPian->setPixmap(QPixmap(strImage).scaled(labelZhaoPian->size()));

相应地,清除头像的代码就很简单了

    labelZhaoPian->setPixmap(QPixmap());
  labelZhaoPian->setText("照\n\n片");


2、保存图像到数据库中,以PNG格式

  if (labelZhaoPian->pixmap()->isNull() == false)
  {
    QByteArray bytes;
    QBuffer buffer(&bytes);
    buffer.open(QIODevice::WriteOnly);
    labelZhaoPian->pixmap()->save(&buffer, "PNG");
          QString out;
        for(int n = 0; n < (int)bytes.size(); ++n)
          {
          QString str;
          str.sprintf("%02x", (uchar)bytes[n]);
          out.append(str);
        }
    query.exec(QString("UPDATE profile SET photo = 0x%1 WHERE ID = %2").arg(out).arg(iProfileId));
  }


3、从数据库中读取出图像来,并显示

    QSqlQuery q("SELECT photo FROM profile WHERE iprofileid = 1");
      if (q.next())
      {
        if (q.isNull(0) == false)
    {
        QPixmap photo;
        photo.loadFromData(q.value(0).toByteArray(), "PNG");
        labelZhaoPian->setPixmap(photo);
    }
      }

欢迎到 XChinux 的个人主页看更多内容阅读全文(2029) | 回复2 | 推送
guest 于 2007-09-15 00:07
XChinux你好

我用的代码片段如下:
    QFile* file=new QFile(fileName); //fileName为二进制数据文件名
    file->open(QIODevice::ReadOnly);

    QSqlQuery query;
     query.prepare("INSERT INTO myTestDB (Id, BlobData) "
                          "VALUES (?, ?)");
                         
     QString tmp=nameEdit->text(); //nameEdit是自己定义的QLineEdit输入框名字
     QVariant name(tmp);
     query.addBindValue(name);

     QByteArray Data;
     Data=file->readAll();
     file->close();
     query.addBindValue(Data);

     query.exec();

这样把图像保存到数据库里,代码也还算清晰。

不过,现在有一个问题:
我是用的256M内存的赛阳2.4GHz的Windows2000系统下的Access做的测试,
把10M的mp3音频文件保存到数据库用时在22秒左右,内存占用50M;
当我试图将100M的视频文件保存到数据库时,系统无响应!!!
我尝试将100M文件分割成10M的数据块逐块保存,没有发现合适的append()函数

不知道您是否能提供一点在Qt下将100M以上的大文件保存到数据库的建议呢?

谢谢。

guest 于 2007-09-15 09:45
这个是与数据库有关系的吧,看数据库的bin类型字段最大存储多少的数据。
引自:http://www.qtcn.org/blog/article.php?itemid-627-type-blog.html

阅读(4547) | 评论(0) | 转发(0) |
0

上一篇:qt半透明

下一篇:你的世界我曾经来过

给主人留下些什么吧!~~