【问题标题】:How to convert an image(BYTE*) to Base64如何将图像(BYTE *)转换为 Base64
【发布时间】:2017-04-09 16:22:26
【问题描述】:

我在 imgBuffer 中捕获了指纹图像。

BYTE *imgBuffer = new BYTE[m_ImageWidth*m_ImageHeight];
myObj->GetImage(imgBuffer);

将其转换为 Base64。

int imgBufferSize = sizeof(imgBuffer) - 1;
QByteArray temp = QByteArray(*imgBuffer, imgBufferSize);
QByteArray base64Image = temp.toBase64();

但我得到的是这样的:

 BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==

我关注了这个:How to convert an array into QByteArray?

编辑: 实际上,在实施 Jacob 的解决方案后,我得到了另一个 Base64 字符串,但这也不是图像。尽管雅各布的解决方案是正确的。问题是图像没有任何元数据。所以,我使用以下程序解决了它:

QImage jpgImage((const unsigned char*)imgBuffer, m_ImageWidth, m_ImageHeight, QImage::Format_Grayscale8);

QByteArray mImage64ByteArray;
QBuffer buffer(&mImage64ByteArray);
buffer.open(QIODevice::WriteOnly);
jpgImage.save(&buffer, "JPG");
mImage64ByteArray = mImage64ByteArray.toBase64();

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    @Jacob 是正确的。只是为了告诉你什么是错的,这里是更正的版本:

    int imgBufferSize = sizeof(imgBuffer);// - 1 propably wrong
    QByteArray temp = QByteArray(imgBuffer, imgBufferSize); //use the pointer!
    QByteArray base64Image = temp.toBase64();
    

    如您所见,您需要传递指针。此外,由于您使用的是字节数组,而不是 c 字符串,因此 -1 可能是错误的!但这当然取决于GetImage 方法

    【讨论】:

      【解决方案2】:

      您没有为QByteArray 调用正确的构造函数。当您将 imgBuffer 指针传递给 QByteArray 构造函数时,您可能并不是要取消引用它。在您的情况下最终发生的是您最终调用了 QByteArray(int size, char ch) 构造函数而不是 QByteArray(const char* data, int size) 构造函数。

      除此之外,imgBufferSize 肯定会出错,因为您在指针类型上使用sizeof,它只会返回指针的大小而不是分配的内存大小。 imgBufferSize 应该是 m_ImageWidth*m_ImageHeight。这就解释了为什么您的 base64 编码字符串中充满了与 0x07 相符的值,因为这是您平台上指针的大小减去 1。

      所以正确的代码应该是这样的:

      int imgBufferSize = m_ImageWidth*m_ImageHeight;
      QByteArray temp = QByteArray(imgBuffer, imgBufferSize);
      QByteArray base64Image = temp.toBase64();
      

      除此之外,您应该听听您的编译器,因为合理的编译器会在从 int 到 char 的缩小转换时向您发出警告。同样,如果您使用调试器单步调试代码,这些问题中的一些应该是相当明显的。还值得考虑摆脱字节数组的手动分配,而一直使用 QByteArray。这将消除一些复制,使您不必手动管理内存,并简化您的程序。

      【讨论】:

      • 错误:没有构造函数“QByteArray::QByteArray”的实例与参数列表匹配。参数类型为:(BYTE *, int)
      • 看看BYTE的类型是什么。我猜 BYTE 是无符号字符的 typedef,而 QByteArray 需要有符号字符。
      • typedef unsigned char BYTE;
      • 好吧,那么你可以看看这个答案来弄清楚如何在两种指针类型之间安全地转换:stackoverflow.com/a/16261758/327071
      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2011-01-27
      • 2013-12-12
      相关资源
      最近更新 更多