Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved]How to save an image into a database
Forum Updated to NodeBB v4.3 + New Features

[Solved]How to save an image into a database

Scheduled Pinned Locked Moved General and Desktop
13 Posts 4 Posters 6.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    clochydd
    wrote on last edited by
    #4

    Hi ealione,

    this is how I save my images in a PostgreSQL database:
    @
    CREATE TABLE imagines
    (
    imagi integer NOT NULL,
    image bytea,
    CONSTRAINT imaginesx PRIMARY KEY (imagi)
    )
    @

    @
    QSqlQuery q;
    QString filename;
    QPixmap mypix (fileName);
    QByteArray baImg;
    QBuffer buffer(&baImg);
    buffer.open( QBuffer::WriteOnly );

    QImage image(fileName);

    QPixmap::fromImage(image).save(&buffer, "JPG");

    q.prepare("INSERT INTO imagines (imagi, pos, image) VALUES (:index, :image);");
    q.bindValue(":index", 1000);
    q.bindValue(":image", baImg);
    if (!q.exec()) {
    qDebug() << q.lastError();
    }

    @

    This works perfectly and I saved over 3000 images 'til today.
    Hope it helps!

    1 Reply Last reply
    1
    • ealioneE Offline
      ealioneE Offline
      ealione
      wrote on last edited by
      #5

      Hey Clochydd,
      Thank you for the example, it works indeed. Hoe did you tackle the data size issue though, because I get

      @QSqlError("54000", "QPSQL: Unable to create query", "ERROR: index row requires 80240 bytes, maximum size is 8191
      (54000)")@

      1 Reply Last reply
      0
      • yeckelY Offline
        yeckelY Offline
        yeckel
        wrote on last edited by
        #6

        Hi,

        I didn't found an easy way to do that so I'm usigng pqxx and temporary file for saving images:

        @void DatabaseInterface::store_image(OcrData ocr_data)
        {
        C->prepare( "insert_picture", "INSERT INTO water_log( value, image, confidence, time ) VALUES ($1, $2, $3, now())" );
        std::string file_name = "/tmp/ocr_tmp_image.png";
        std::ifstream file(file_name.c_str());
        std::string content((std::istreambuf_iterator<char>(file)),std::istreambuf_iterator<char>());

        pqxx::binarystring bytea_blob( content);
        pqxx::work work( *C );
        pqxx::result result = work.prepared( "insert_picture" )( ocr_data.ocr_string )( bytea_blob )( ocr_data.confidence ).exec&#40;&#41;;
        work.commit();
        

        }@

        1 Reply Last reply
        0
        • C Offline
          C Offline
          clochydd
          wrote on last edited by
          #7

          Hi ealione,
          it seems you try to use the bytea field as an index, I suggest to use a separate integer field as the index.

          1 Reply Last reply
          0
          • ealioneE Offline
            ealioneE Offline
            ealione
            wrote on last edited by
            #8

            Hi yeckel,
            I will have pqxx in mind as an option.

            Clochydd I am not quite sure what you mean. I have the exact table with you and I pass the ByteArray in the exact same way.

            1 Reply Last reply
            0
            • C Offline
              C Offline
              clochydd
              wrote on last edited by
              #9

              IMHO, your error messages "...index row requires 80240 bytes..." means that the indexed field is too large and I presume you try to use the bytea field as an index.
              Could you post your postgres CREATE TABLE statement?

              1 Reply Last reply
              0
              • ealioneE Offline
                ealioneE Offline
                ealione
                wrote on last edited by
                #10

                Sure, its as you showed in your first post with some very small changes

                @QSqlQuery query(db);
                query.exec("CREATE TABLE imQt "
                "(im_id integer NOT NULL, "
                "im_data bytea, "
                "CONSTRAINT imaginesx PRIMARY KEY (im_data)) ");@

                Now when you pass data to your table you use

                @(imagi, pos, image) @

                and then as values you only bind imagi and image. Not sure what pos is.

                EDIT
                Yes it seems you are right I am indeed using the wrong indexes in my table creation.

                1 Reply Last reply
                0
                • C Offline
                  C Offline
                  clochydd
                  wrote on last edited by
                  #11

                  Then you may simply change "PRIMARY KEY (im_data)" to "PRIMARY KEY (im_id)"! Hope it works - happy coding!

                  1 Reply Last reply
                  0
                  • C Offline
                    C Offline
                    clochydd
                    wrote on last edited by
                    #12

                    Ignore the pos field - I made the sample from a bigger table and pos is not necessary for our experiment...

                    1 Reply Last reply
                    0
                    • ealioneE Offline
                      ealioneE Offline
                      ealione
                      wrote on last edited by
                      #13

                      Yes, your example was correct all along, my bad.

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved