用C,C++代码实现二进制数据与图片的转化

//png和jpg图片也类似。输入输出都改为png格式图片。

//*********** 路径
string sPicPath = CCFileUtils::sharedFileUtils()->getWritablePath() + "voiceOn.png";
    string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    string sMydata = CCFileUtils::sharedFileUtils()->getWritablePath() + "myData.txt";
//***********

函数 ftell 用于得到文件位置指针 当前位置 相对于 文件首 的偏移字节数。

    unsigned long pSize = 0;
    unsigned char *pBuffer = NULL;
    FILE *fp = fopen(sPicPath.c_str(),"rb");    //读取某张图片
    if(!fp) return false;

    fseek(fp, 0,  SEEK_END);
    pSize =  ftell(fp);                //获取图片大小
    fseek(fp, 0,  SEEK_SET);
    pBuffer =  new unsigned char[pSize];    //有new就要有delete,这边是delete[] pBuff;  pBuff = NULL;
    pSize = fread(pBuffer, sizeof(unsigned char), pSize, fp);
    fclose(fp);

    if(!pBuffer) return false;

//最后要删除
 delete[] pBuffer;
    pBuffer = 0;


方法一,基于C++的文件操作:  (可进行定位读、定位写)

1、 将png图片以二进制文件的形式读入并保持在二进制文件中:
string sPicPath = CCFileUtils::sharedFileUtils()->getWritablePath() + "voiceOn.png"; 
    string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    int nRead = 0;
    char chBuf[1024] = {0};         //这边可以控制图片的大小,1024 = 1KB, 1024*1024 = 1M
    string sData;

    ifstream fin(sPicPath.c_str(), ios::binary);
    if(!fin) return false;
    fin.read(chBuf, sizeof(chBuf));
    if(fin.eof() != 1)     //图片大小判断
    {
        CCLog("pic is bigger than my array!");
        fin.close();
        return false;
    }
    fin.close();

    ofstream fout(sSavePath.c_str(), ios::binary);
    if(!fout) return false;
    fout.write(chBuf, sizeof(chBuf));
    fout.close();

2、将二进制文件读出并保持至新的png图片:
string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    string sGetPic = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.png";
    int nRead = 0;
    char chBuf[1024] = {0};


    ifstream fin(sSavePath.c_str(), ios::binary);
    if(!fin) return;
    fin.read(chBuf, sizeof(chBuf));
   /* if(fin.eof() != 1)
    {
        CCLog("pic is bigger than my array!");
        fin.close();
        return;
    }*/
    fin.close();

    ofstream fout(sGetPic.c_str(), ios::binary);
    if(!fout) return;
    fout.write(chBuf, sizeof(chBuf));

    fout.close();


方法一 (a),基于C++的文件操作(定位在文件指定位置进行读写):
1、 将png图片以二进制文件的形式读入并保持在二进制文件中:
string sPicPath = CCFileUtils::sharedFileUtils()->getWritablePath() + "voiceOn.png"; 
    string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    int nRead = 0;
    char chBuf[1024] = {0};


    ifstream fin(sPicPath.c_str(), ios::binary);
    if(!fin) return false;
    fin.read(chBuf, sizeof(chBuf));
    if(fin.eof() != 1)
    {
        CCLog("pic is bigger than my array!");
        fin.close();
        return false;
    }
    fin.close();

    ofstream fout(sSavePath.c_str(), ios::binary);
    if(!fout) return false;
    fout. seekp(1024, ios::beg);             //定位到文件1024位置进行写操作
    fout. write(chBuf, sizeof(chBuf));
    fout.close();

2、将二进制文件读出并保持至新的png图片:
string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    string sGetPic = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.png";
    int nRead = 0;
    char chBuf[1024] = {0};


    ifstream fin(sSavePath.c_str(), ios::binary);
    if(!fin) return;
    fin. seekg(1024, ios::beg);         //定位到文件1024位置进行读操作
    fin. read(chBuf, sizeof(chBuf));
    /*if(fin.eof() != 1)
    {
        CCLog("pic is bigger than my array!");
        fin.close();
        return;
    }*/
    fin.close();

    ofstream fout(sGetPic.c_str(), ios::binary);
    if(!fout) return;
    fout.write(chBuf, sizeof(chBuf));

    fout.close();

方法二,用流式FILE文件操作:  (可进行定位读、 定位写)
1、将png图片保存到二进制文件中;
string sPicPath = CCFileUtils::sharedFileUtils()->getWritablePath() + "test.png";
    string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    int nRead = 0;
    char chBuf[256] = {0};

    FILE *fin = fopen(sPicPath.c_str(), "rb");
    FILE *fout = fopen(sSavePath.c_str(), "wb");

    if(fin == NULL || fout == NULL) return false;

    nRead = fread(chBuf,sizeof(char), 256, fin);
    while (true)
    {
        fwrite(chBuf, sizeof(char), 256, fout);
        if(nRead < 256) break;
        nRead = fread(chBuf, sizeof(char), 256, fin);
    }
    fclose(fin);
    fclose(fout);

    string sPicPath = CCFileUtils::sharedFileUtils()->getWritablePath() + "voiceOn.png";
    string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    int nRead = 0;

    unsigned long pSize = 0;
    unsigned char * pBuffer = NULL;
    FILE *fp = fopen(sPicPath.c_str(),"rb");
    if(!fp) return false;

    fseek(fp, 0, SEEK_END);
     pSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    pBuffer =  new unsigned char[ pSize];
    if(!pBuffer) return false;
    pSize = fread(pBuffer, sizeof(unsigned char), pSize, fp);
    fclose(fp);

    

    FILE *fout = fopen(sSavePath.c_str(), "wb");
    if(!fout) return false;
    unsigned long nWSize = 0;
    fseek(fout, 1024, SEEK_SET);
    nWSize = fwrite(pBuffer, sizeof(unsigned char), pSize, fout);
    fclose(fout);

    delete[] pBuffer;
    pBuffer = 0;


2、将二进制文件读出图片;

string sSavePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.bat";
    string sGetPic = CCFileUtils::sharedFileUtils()->getWritablePath() + "mysavePic.png";
    int nRead = 0;
    char chBuf[256] = {0};
    FILE *fin = fopen(sSavePath.c_str(), "rb");
    FILE *fout = fopen(sGetPic.c_str(), "wb");
    if(fin == NULL || fout == NULL) return ;
    nRead = fread(chBuf, sizeof(char), 256, fin);
    while (1)
    {
        fwrite(chBuf,sizeof(char),256,fout);
        if(nRead < 256) break;
        nRead = fread(chBuf,sizeof(char), 256, fin);
    }

    fclose(fin);
    fclose(fout);

你可能感兴趣的:(C/C++)