使用字节数组c++时出错
Error when using byte array C++
我正在尝试将标准的24位BMP文件读取为字节数组,以便我可以将该字节数组发送到libpng以保存为png。我的代码,它编译:
#include <string>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "png.h"
using namespace std;
namespace BMP2PNG {
long getFileSize(FILE *file)
{
long lCurPos, lEndPos;
lCurPos = ftell(file);
fseek(file, 0, 2);
lEndPos = ftell(file);
fseek(file, lCurPos, 0);
return lEndPos;
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
std::string filenamePNG = "D:\TEST.png";
FILE *fp = fopen(filenamePNG.c_str(), "wb");
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
png_info *info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr, fp);
png_set_IHDR(png_ptr,info_ptr,1920,1080,16,PNG_COLOR_TYPE_RGB,PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_BASE,PNG_FILTER_TYPE_BASE);
png_write_info(png_ptr,info_ptr);
png_set_swap(png_ptr);
const char *inputImage = "G:\R-000.bmp";
BYTE *fileBuf;
BYTE *noHeaderBuf;
FILE *inFile = NULL;
inFile = fopen(inputImage, "rb");
long fileSize = getFileSize(inFile);
fileBuf = new BYTE[fileSize];
noHeaderBuf = new BYTE[fileSize - 54];
fread(fileBuf,fileSize,1,inFile);
for(int i = 54; i < fileSize; i++) //gets rid of 54-byte bmp header
{
noHeaderBuf[i-54] = fileBuf[i];
}
fclose(inFile);
png_write_rows(png_ptr, (png_bytep*)&noHeaderBuf, 1);
png_write_end(png_ptr, NULL);
fclose(fp);
}
};
不幸的是,当我点击运行代码的按钮时,我得到一个错误"试图读取或写入受保护的内存…"。我对c++非常陌生,但我认为我正确地读取了文件。为什么会发生这种情况,我该如何解决它?
另外,我的最终目标是一次读取一个BMP像素行,所以我不使用太多内存。如果BMP是1920x1080,我只需要为每行读取1920x 3字节。我如何将一个文件一次读取n个字节到字节数组中呢?
您的getFileSize()
方法实际上没有返回文件大小。您基本上移动到BMP头中的正确位置,但不是实际读取表示大小的下一个4字节,而是返回文件中的位置(始终为2)。然后在调用函数中,你没有任何错误检查,你的代码假设文件大小总是大于54(例如读缓冲区的分配)。
还要记住,BMP头中的文件大小字段可能并不总是正确的,您还应该考虑实际的文件大小。
您正在读取*.bmp文件的文件大小,但"实际"数据可能更大。BMP可以有压缩(RLE)。之后,当您将解压缩的PNG写入该数组时,您可以获得图像的溢出大小,因为您先前获得了压缩BMP文件的大小。
In function
png_set_IHDR(png_ptr,info_ptr,1920,1080,16,PNG_COLOR_TYPE_RGB,PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_BASE,PNG_FILTER_TYPE_BASE);
为什么将位深度设置为16 ?不应该是8,因为BMP的每个RGB通道都是8位。
同样用于PNG处理,我使用这个库:http://lodev.org/lodepng/。
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 为x86而非x64编译时出错
- 从R调用C++函数并对其进行集成时出错
- 这个函数哪里出错了
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 为重写std::exception的库生成swig接口时出错
- 导入/导出变量时出错
- PrintWindow函数在notepad.exe中出错