How convert the raw data(hexadecimal) to image ?
-
Human interface device (hid board) connected through hidapi library in visual studio I can't get the image?
how to get the image as per received data I'm receiving 1024 * 1024 hexadecimal value? -
@Rockerz
Not sure what this means. If you receive a string of, say, hexadecimal characters then you need to convert those to binary/bytes, e.g. QByteArray QByteArray::fromHex(const QByteArray &hexEncoded). -
@JonB
continuously receiving data from the hid device raw data that raw converted to be image
I converted to image but display in 3232 , 64 * 64 only not 512 512 & 1024 * 1024 pixels ?how to solve this issue?@Rockerz Is it fair to assume that screenshot is the result of using QDebug to dump the received QByteArray?
If so, then you do NOT have hexadecimal anything in the byte array.
continuously receiving data from the hid device raw data that raw converted to be image
First, accumulate that data in a single block until you have a complete image. How you determine "complete" we cannot say.
Then you need to know precisely what arrangement that "raw data" has in terms of pixel dimensions, pixel packing, bit-depth, colour mapping etc. What that might be we cannot say.
Then you will be equipped to see if there is a way to turn that data as-is into a QImage or QPixmap. If not then you may need to process it before using Qt functions (your own processing or some 3rd-party library).
-
@Rockerz Is it fair to assume that screenshot is the result of using QDebug to dump the received QByteArray?
If so, then you do NOT have hexadecimal anything in the byte array.
continuously receiving data from the hid device raw data that raw converted to be image
First, accumulate that data in a single block until you have a complete image. How you determine "complete" we cannot say.
Then you need to know precisely what arrangement that "raw data" has in terms of pixel dimensions, pixel packing, bit-depth, colour mapping etc. What that might be we cannot say.
Then you will be equipped to see if there is a way to turn that data as-is into a QImage or QPixmap. If not then you may need to process it before using Qt functions (your own processing or some 3rd-party library).
-
@Rockerz Is it fair to assume that screenshot is the result of using QDebug to dump the received QByteArray?
If so, then you do NOT have hexadecimal anything in the byte array.
continuously receiving data from the hid device raw data that raw converted to be image
First, accumulate that data in a single block until you have a complete image. How you determine "complete" we cannot say.
Then you need to know precisely what arrangement that "raw data" has in terms of pixel dimensions, pixel packing, bit-depth, colour mapping etc. What that might be we cannot say.
Then you will be equipped to see if there is a way to turn that data as-is into a QImage or QPixmap. If not then you may need to process it before using Qt functions (your own processing or some 3rd-party library).
-
@ChrisW67
I changed the color as black so it displays Received data as 00 00 00 00 currently receiving 512 data continuously -
@Rockerz What is "512 data continuously" supposed to mean? An image has a finite size, it is not "continuous."
Do you have any idea of the answers to my earlier questions?
-
@ChrisW67 said in How convert the raw data(hexadecimal) to image ?:
pixel packing, bit-depth, colour mapping etc.
@ChrisW67 I didnt get the color of the image? what is the issue and how to display 8 bit color in this code?
QImage image(512, totalBytesRead / 512, QImage::Format_Indexed8); QVector<QRgb> colorTable; for (int i = 0; i < 255; ++i) { colorTable.append(qRgb(i, i, i)); } image.setColorTable(colorTable); for (int i = 0; i < totalBytesRead; ++i) { imageBuffer.append(data[i]); } if (imageBuffer.size() >= 512 * (totalBytesRead / 512)) { for (int y = 0; y < totalBytesRead / 512; ++y) { for (int x = 0; x < 512; ++x) { int index = y * 512 + x; if (index < imageBuffer.size()) { image.setPixel(x, y, imageBuffer[index]); } } } ui.label->setPixmap(QPixmap::fromImage(image)); imageBuffer.clear(); }
-
@ChrisW67 I didnt get the color of the image? what is the issue and how to display 8 bit color in this code?
QImage image(512, totalBytesRead / 512, QImage::Format_Indexed8); QVector<QRgb> colorTable; for (int i = 0; i < 255; ++i) { colorTable.append(qRgb(i, i, i)); } image.setColorTable(colorTable); for (int i = 0; i < totalBytesRead; ++i) { imageBuffer.append(data[i]); } if (imageBuffer.size() >= 512 * (totalBytesRead / 512)) { for (int y = 0; y < totalBytesRead / 512; ++y) { for (int x = 0; x < 512; ++x) { int index = y * 512 + x; if (index < imageBuffer.size()) { image.setPixel(x, y, imageBuffer[index]); } } } ui.label->setPixmap(QPixmap::fromImage(image)); imageBuffer.clear(); }
Each byte in your buffer represents a pixel in whatever colour is in that index of the colour table. You are setting up a 256-level grayscale colour map, so you will not see colour. If these pixels are not supposed to be grey then the colour table needs to contain non-grey values. What is supposed to be in the colour table is entirely application-dependent.
If that is not the problem you are seeing then you need to better explain what you are expecting and receiving.
See this example for a faster way to handle the specific raw 256 colour indexed image format and the effect of not knowing the colour table:
#include <QCoreApplication> #include <QByteArray> #include <QImage> int main(int argc, char **argv) { QCoreApplication app(argc, argv); // Create some fake data that should be a gradient in greyscale QByteArray fakeData(256 * 256, '\0'); for (int r = 0; r < 256; ++r) { for (int c = 0; c < 256; ++c) { fakeData[r * 256 + c] = (r + c) / 2; } } QImage image(reinterpret_cast<uchar*>(fakeData.data()), 256, 256, 256, QImage::Format_Indexed8); image.setColorCount(256); for (int i = 0; i < 255; ++i) image.setColor(i, qRgb(i, i, i)); image.save("grey.png"); // same data different colour map for (int i = 0; i < 255; ++i) image.setColor(i, qRgb(i, 0, 0)); image.save("reds.png"); // ditto with an ancient VGA colour map quint32 vgaColorMap[256] = { 0x000000, 0x0000a8, 0x00a800, 0x00a8a8, 0xa80000, 0xa800a8, 0xa85400, 0xa8a8a8, 0x545454, 0x5454fc, 0x54fc54, 0x54fcfc, 0xfc5454, 0xfc54fc, 0xfcfc54, 0xfcfcfc, 0x000000, 0x141414, 0x202020, 0x2c2c2c, 0x383838, 0x444444, 0x505050, 0x606060, 0x707070, 0x808080, 0x909090, 0xa0a0a0, 0xb4b4b4, 0xc8c8c8, 0xe0e0e0, 0xfcfcfc, 0x0000fc, 0x4000fc, 0x7c00fc, 0xbc00fc, 0xfc00fc, 0xfc00bc, 0xfc007c, 0xfc0040, 0xfc0000, 0xfc4000, 0xfc7c00, 0xfcbc00, 0xfcfc00, 0xbcfc00, 0x7cfc00, 0x40fc00, 0x00fc00, 0x00fc40, 0x00fc7c, 0x00fcbc, 0x00fcfc, 0x00bcfc, 0x007cfc, 0x0040fc, 0x7c7cfc, 0x9c7cfc, 0xbc7cfc, 0xdc7cfc, 0xfc7cfc, 0xfc7cdc, 0xfc7cbc, 0xfc7c9c, 0xfc7c7c, 0xfc9c7c, 0xfcbc7c, 0xfcdc7c, 0xfcfc7c, 0xdcfc7c, 0xbcfc7c, 0x9cfc7c, 0x7cfc7c, 0x7cfc9c, 0x7cfcbc, 0x7cfcdc, 0x7cfcfc, 0x7cdcfc, 0x7cbcfc, 0x7c9cfc, 0xb4b4fc, 0xc4b4fc, 0xd8b4fc, 0xe8b4fc, 0xfcb4fc, 0xfcb4e8, 0xfcb4d8, 0xfcb4c4, 0xfcb4b4, 0xfcc4b4, 0xfcd8b4, 0xfce8b4, 0xfcfcb4, 0xe8fcb4, 0xd8fcb4, 0xc4fcb4, 0xb4fcb4, 0xb4fcc4, 0xb4fcd8, 0xb4fce8, 0xb4fcfc, 0xb4e8fc, 0xb4d8fc, 0xb4c4fc, 0x000070, 0x1c0070, 0x380070, 0x540070, 0x700070, 0x700054, 0x700038, 0x70001c, 0x700000, 0x701c00, 0x703800, 0x705400, 0x707000, 0x547000, 0x387000, 0x1c7000, 0x007000, 0x00701c, 0x007038, 0x007054, 0x007070, 0x005470, 0x003870, 0x001c70, 0x383870, 0x443870, 0x543870, 0x603870, 0x703870, 0x703860, 0x703854, 0x703844, 0x703838, 0x704438, 0x705438, 0x706038, 0x707038, 0x607038, 0x547038, 0x447038, 0x387038, 0x387044, 0x387054, 0x387060, 0x387070, 0x386070, 0x385470, 0x384470, 0x505070, 0x585070, 0x605070, 0x685070, 0x705070, 0x705068, 0x705060, 0x705058, 0x705050, 0x705850, 0x706050, 0x706850, 0x707050, 0x687050, 0x607050, 0x587050, 0x507050, 0x507058, 0x507060, 0x507068, 0x507070, 0x506870, 0x506070, 0x505870, 0x000040, 0x100040, 0x200040, 0x300040, 0x400040, 0x400030, 0x400020, 0x400010, 0x400000, 0x401000, 0x402000, 0x403000, 0x404000, 0x304000, 0x204000, 0x104000, 0x004000, 0x004010, 0x004020, 0x004030, 0x004040, 0x003040, 0x002040, 0x001040, 0x202040, 0x282040, 0x302040, 0x382040, 0x402040, 0x402038, 0x402030, 0x402028, 0x402020, 0x402820, 0x403020, 0x403820, 0x404020, 0x384020, 0x304020, 0x284020, 0x204020, 0x204028, 0x204030, 0x204038, 0x204040, 0x203840, 0x203040, 0x202840, 0x2c2c40, 0x302c40, 0x342c40, 0x3c2c40, 0x402c40, 0x402c3c, 0x402c34, 0x402c30, 0x402c2c, 0x40302c, 0x40342c, 0x403c2c, 0x40402c, 0x3c402c, 0x34402c, 0x30402c, 0x2c402c, 0x2c4030, 0x2c4034, 0x2c403c, 0x2c4040, 0x2c3c40, 0x2c3440, 0x2c3040, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000 }; for (int i = 0; i < 255; ++i) image.setColor(i, 0xff000000 + vgaColorMap[i]); image.save("vga.png"); return 0; }
-