0

標準の 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++ に非常に慣れていませんが、ファイルを正しく読み込んでいると思いました。これはなぜ起こり、どうすれば修正できますか?

また、私の最終目標は、一度に 1 ピクセル行ずつ BMP を読み取ることなので、メモリをあまり使用しません。BMP が 1920x1080 の場合、行ごとに 1920 x 3 バイトを読み取るだけで済みます。一度に n バイトずつファイルをバイト配列に読み込むにはどうすればよいですか?

4

3 に答える 3

0

機能中

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 に設定されているのはなぜですか? BMP からの各 RGB チャネルは 8 ビットなので、8 である必要はありません。

また、PNG の処理には、このライブラリを使用しています: http://lodev.org/lodepng/。それは正常に動作します。

于 2013-04-01T08:47:33.993 に答える