我知道有一天我会回来咬我。我正在读取图像,调整大小到48像素高(无论宽度如何),然后抓取总图像列并读取每个单独的像素以获得颜色值。所有这些信息都会写到文件中。代码的简洁版本是这样的:
unsigned char cols, rows;
unsigned char red, green, blue;
short int myCol, myRow;
cols = processedImage.columns();
rows = processedImage.rows();
myFile.write(reinterpret_cast<const char *>(&cols), sizeof(cols));
for (myCol = cols - 1; myCol >= 0; myCol--) {
for (myRow = rows - 1; myRow >= 0; myRow--) {
Magick::ColorRGB rgb(processedImage.pixelColor(myCol, myRow));
red = rgb.red() * 255;
green = rgb.green() * 255;
blue = rgb.blue() * 255;
myFile.write(reinterpret_cast <const char*> (&red), sizeof(red));
myFile.write(reinterpret_cast <const char*> (&green), sizeof(green));
myFile.write(reinterpret_cast <const char*> (&blue), sizeof(blue));
}
}
这里的问题是文件比 char 所能容纳的文件宽。例如,我正在处理一个494x48像素的文件。
当我查看创建的(二进制)文件时,保留列数的第一行表示它是&#39; 238&#39; 238。下一行开始RGB数据:
0: 238 // Column count
1: 255 // Red
2: 0 // Green
3: 0 // Blue
4: 255 // Red
5: 0 // Green
6: 0 // Blue
所以我被卡住了。如何将实际列值作为单行存储在结果文件中?
答案 0 :(得分:0)
如果使用多个字符而不是一个字符呢?假设有4个字符来存储cols,rows等,因为字符可以存储0-255,所以4个字符将存储256x256x256x256,即32位,足够长
答案 1 :(得分:0)
回答我自己的问题。 感谢大家,他们做出了回应并帮助弄清楚我做错了什么。这里的问题源于几个月根据Arduino代码做出假设。 Arduino有一个INT / UINT,我用它来读取生成文件的值。我认为数据类型是uint8_t,而实际上我发现它确实是一个uint16_t。因为它弄乱了代码中的其他部分(即在文件中要寻找的位置),我已经切换到 char 数据类型,因为它只占用了1个字节。但在这样做的过程中,我坚持了上面提到的翻滚问题。所以解决方案,现在我更了解Arduino代码中的数据类型:
最终,我现在停止使用Arduino的内置数据类型,并切换到实际上与他们所说的平台无关的数据类型。
将这一点归结为另一种学习经历(在我实际学习c ++的整个过程中)......