C++ 读取bmp内容
来源:互联网 发布:java基础课程设计 编辑:程序博客网 时间:2024/05/16 07:36
最近在写b站的弹幕,首先碰到的就是如何将图片显示。
后来发现b站弹幕底层用的是flash的bitmap来将图像显示。大致的流程是
输入一串base64加密的字符串->extract取出所有的pixel->Bitmap.setpixel进行显示
这里直接贴出代码
function extract(data) { var bmd = Bitmap.createBitmapData(1, 1); var output = bmd.getPixels(bmd.rect); output.clear(); var dataBuffer = []; dataBuffer.length = 4; var outputBuffer = []; outputBuffer.length = 3; for (var i = 0; i < data.length; i += 4) { for (var j = 0; j < 4 && i + j < data.length; j++) { dataBuffer[j] = BASE64_CHARS.indexOf(data.charAt(i + j)); } outputBuffer[0] = (dataBuffer[0] << 2) + ((dataBuffer[1] & 0x30) >> 4); outputBuffer[1] = ((dataBuffer[1] & 0x0f) << 4) + ((dataBuffer[2] & 0x3c) >> 2); outputBuffer[2] = ((dataBuffer[2] & 0x03) << 6) + dataBuffer[3]; for (var k = 0; k < outputBuffer.length; k++) { if (dataBuffer[k + 1] == 64) break; output.writeByte(outputBuffer[k]); } } output.position = 0; return output;}上述代码用来将base64字符串生成一个所有图像数据的一维数组。
int main(int argc, const char * argv[]) { stringstream ss(""); ifstream in("文件位置", ios::in | ios::binary); if (! in.is_open()) { cout << "Error opening file"; exit (1); } int num[4], cnt = 0, thresh = 0; int temp, width_cnt = 0; long length = LONG_MAX - 54; char buf[10] = ""; long width = 0, height = 0; while (!in.eof() && cnt < length + 54) { if (cnt == 18) { in.read((char *) &width, 4); in.read((char *) &height, 4); length = (width + 4 - width % 4) * height * 3;// cout<<"size:"<<width<<" * "<<height<<endl; cnt += 8; continue; } if (cnt >= 54) { thresh = 0; width_cnt ++; for (int i = 2; i >= 0; i--) { in.read((char *)(&num[i+1]), 1); thresh += num[i+1]; cnt++; } if (thresh == 255 * 3) { num[0] = 0; } else { num[0] = 255; } for (int i = 0; i < 4; i++) { sprintf(buf, "%02x", num[i]); ss<<buf<<" "; } if (width_cnt == width) { if (width_cnt < (width + 4 - width % 4) && width % 4) { for (int i = 0; i < 4 - width % 4; ++i) { in.read((char *)(&temp), 1); } } width_cnt = 0; continue; } } else { in.read((char *)(&temp), 1); cnt++; } } string result = ss.str();// reverse(result.begin(), result.end()); cout<<result; return 0;}上述C++代码通过读取bmp将每个像素RGB对应的byte以16进制的方式打印出来。
bmp的格式在18字节处存储了宽高的信息,从第54字节处是所有实际的图像数据。
需要注意的是bmp是4字节对齐的,所以遇到不是4字节对齐的长宽需要额外处理。
0 0
- C++ 读取bmp内容
- c语言读取bmp文件
- BMP图像内容读取中的问题
- C语言读取BMP图像到数组,BMP图片格式
- c语言读取bmp文件格式(转载)
- c 语言读取BMP格式文件源代码
- C语言读取BMP格式图片
- 【原创】C语言读取BMP格式图片
- C语言读取BMP图像数据(转)
- 使用C语言读取bmp文件数据
- C语言读取BMP格式的图片
- 使用C函数读取BMP格式图像
- c语言读取bmp文件完整版
- 纯c语言读取BMP图像
- c#读取Excel内容
- C读取文件内容
- 读取BMP
- 二进制读取文件内容[C#]
- 【TED】处乱不惊-Daniel Levitin
- AIDL实现应用进程间的通信。
- Kernel. EXPORT_SYMBOL解析
- 多维数组 对应的产品数量和价格相加
- 小技巧8-iOS 使用Global BreakPoint(全局断点)快速定位Bug
- C++ 读取bmp内容
- 悲观锁与乐观锁
- Spark stage切分和提交
- android中aidl的简单使用
- 【iOS开发】总结
- 基于mini2440 的 bootloader 设计 ---- 4、CPU核心初始化
- sicily 1513 Decoding
- 奇怪的SharedPreference
- asp.net MVC: PagedList + View Model