Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取c+中BMP文件的所有字节+;并旋转图片_C++_File_Visual C++_Bmp - Fatal编程技术网

C++ 读取c+中BMP文件的所有字节+;并旋转图片

C++ 读取c+中BMP文件的所有字节+;并旋转图片,c++,file,visual-c++,bmp,C++,File,Visual C++,Bmp,我有一个BMP文件。我想阅读它的所有字符,并按照这些代码将图片旋转90度。但是这些代码只适用于小图片,颜色也发生了变化。我想用这个800*686像素的图片代码。这个代码对它不起作用。我认为错误在于读取文件,因为当我检查输入文件的字符向量时,在59000字节之后,向量中的所有字符都被0填充,并且文件没有完全读取: struct pixel { char blue; char green; char red; }; int _tmain(int argc, _TCHAR* ar

我有一个BMP文件。我想阅读它的所有字符,并按照这些代码将图片旋转90度。但是这些代码只适用于小图片,颜色也发生了变化。我想用这个800*686像素的图片代码。这个代码对它不起作用。我认为错误在于读取文件,因为当我检查输入文件的字符向量时,在59000字节之后,向量中的所有字符都被0填充,并且文件没有完全读取:

struct pixel
{   char blue;
    char green;
    char red;
};

int _tmain(int argc, _TCHAR* argv[])
{

        //Reading file and save all into data vector
        fstream fl("d://b.bmp");
        ofstream fl2("d://b2.bmp");
        fl.seekg(0,std::ios::end);
        streampos  length = fl.tellg();
        vector<char>  data(length);
        fl.seekg(0,ios::beg);
        fl.read(&data[0],length);


    //make a string of bytes based on characters in "file" vector ,to calculate file features
        byte intfile[54];
        for(int i=0;i<54;i++)
        {
            if (data[i]<0)
                intfile[i]=(256+data[i]);
            else
                intfile[i]=data[i];
        }

        //bpp is 2 bytes on 28,29 characters
        short int bpp = intfile[28] | intfile[29] << 8;

        //size of file is 4 bytes on 2,3,4,5 characters
        unsigned int size= intfile[2] | intfile[3] << 8 | intfile[4] << 16 | intfile[5] << 24;

        //offset of pixeles array is 4 bytes on 10,11,12,13 characters
        unsigned int offset= intfile[10] | intfile[11] << 8 | intfile[12] << 16 | intfile[13] << 24;

        //with is 4 bytes on 18,19,20,21 characters
        unsigned int with= intfile[18] | intfile[19] << 8 | intfile[20] << 16 | intfile[21] << 24;

        //height is 4 bytes on 22,23,24,25 characters
        unsigned int height= intfile[22] | intfile[23] << 8 | intfile[24] << 16 | intfile[25] << 24;

        //format of compression is 4 bytes on 30,31,32,33 characters
        unsigned int format= intfile[30] | intfile[31] << 8 | intfile[32] << 16 | intfile[33] << 24;


        //2D vector of pixels and filling it by data vector
        vector< vector<pixel> > arrpix;
        arrpix.resize(height);
        for(int j=0;j<height;j++)
            arrpix[j].resize(with);

        int ix=offset;
        for(int i=0;i<height;i++){
            for(int j=0;j<with;j++){
                arrpix[i][j].blue=data[ix++]; 
                arrpix[i][j].green=data[ix++];
                arrpix[i][j].red=data[ix++]; 
            }
            ix+=2;//padd
        }

        //2d new vector for making new rotated file
        vector< vector<pixel> > arrpix2;
        arrpix2.resize(with);
        for(int j=0;j<with;j++)
            arrpix2[j].resize(height);

        for(int i=0;i<with;i++)
            for(int j=0;j<height;j++){
                arrpix2[i][j].blue=arrpix[j][with-1-i].blue;
                arrpix2[i][j].green=arrpix[j][with-1-i].green;          
                arrpix2[i][j].red=arrpix[j][with-1-i].red;
            }   

        //newsize
        unsigned int news=(with*height*3)+54;//in rotation pad is not need because the new with is 800

        //makeing new vector
        vector<char>  data2(news);
        for(int i=0;i<news;i++)
            data2[i]=data[i];

        //change size
        data2[5] = (news >> 24) & 0xFF;
        data2[4] = (news >> 16) & 0xFF;
        data2[3] = (news >> 8) & 0xFF;
        data2[2] = news & 0xFF;


        //replace height and with
        for(int i=0;i<4;i++){
            data2[18+i]=data[22+i];
            data2[22+i]=data[18+i];}
        ix=offset;
        //filling data by 2d new vector
        for(int i=0;i<with;i++){
            for(int j=0;j<height;j++){
                data2[ix++]=arrpix2[i][j].blue;
                data2[ix++]=arrpix2[i][j].green;
                data2[ix++]=arrpix2[i][j].red;
            }   
        }


        fl2.write(&data2[0],news);
        fl2.seekp(news,ios::beg);
        fl2.close();


    return 0;
}
struct像素
{焦蓝;
炭绿;
焦红;
};
int _tmain(int argc,_TCHAR*argv[]
{
//读取文件并将所有内容保存到数据向量中
fstream fl(“d://b.bmp”);
流fl2(“d://b2.bmp”);
fl.seekg(0,std::ios::end);
streampos长度=fl.tellg();
矢量数据(长度);
fl.seekg(0,ios::beg);
fl.读取(和数据[0],长度);
//根据“文件”向量中的字符生成一个字节字符串,以计算文件特征
字节文件[54];

对于(int i=0;i当您将文件重新定位到开头时,要实际读取我认为您需要的数据,请执行以下操作:

 fl.seekg(0,ios::beg);
而不是

 fl.seekg(length,ios::beg);
编辑:

在读取后添加此代码:

if(f1.eof())
{
   std::cerr << "Error reading file."
             << " Requested " << length << " bytes."
             << " Read " << f1.gcount() << bytes."
             << std::endl;
}
if(f1.eof())
{

为什么数据是一个向量而不是一个向量?你有办法找到许多“神奇的数字”什么是54?什么是28?什么是29?你应该给他们有意义的名字,并可能计算它们,而不是硬编码它们。@DaleWilson我检查了这一点,但出现了错误。因为file.read与char54一起工作是基于维基百科文档的bmp文件的头,我对这些数字进行了注释。我认为这些并不重要。问题是阅读所有内容字节的字符数,但此代码读取向量中的前59000个字符和由0填充的其他字符。