Как загрузить изображение JPEG в массив символов C ++? - PullRequest
0 голосов
/ 09 ноября 2018

я хочу сохранить изображение JPEG в обычном массиве без знака, я бы использовал ifstream для его хранения; однако, когда я проверил, является ли массив, который я сохранил, правильным или нет (переписав его снова в изображение JPEG), изображение, которое я переписал с использованием сохраненного массива, не может отображаться правильно, поэтому я думаю, что проблема должна возникнуть из-за техники, которую я использую для хранения изображения в массиве, это неправильно. Мне нужен массив, который можно хранить идеально, чтобы я мог использовать его для перезаписи обратно в изображение JPEG. Буду очень признателен, если кто-нибудь поможет мне решить эту проблему!

int size = 921600;
    unsigned char output[size];
    int i = 0;

    ifstream DataFile;
    DataFile.open("abc.jpeg");
    while(!DataFile.eof()){
        DataFile >> output[i];
        i++;
    }
    /* i try to rewrite the above array into a new image here */
    FILE * image2;
    image2 = fopen("def.jpeg", "w");
    fwrite(output,1,921600, image2);
    fclose(image2);

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Обязательно добавьте проверку ошибок при открытии файлов. Найдите размер файла и считайте в буфер в соответствии с размером файла.

Вы также можете использовать std::vector<unsigned char> для хранения символов.

int main()
{
    std::ifstream DataFile("abc.jpeg", std::ios::binary);
    if(!DataFile.good())
        return 0;

    DataFile.seekg(0, std::ios::end);
    size_t filesize = (int)DataFile.tellg();
    DataFile.seekg(0);

    unsigned char output[filesize];
    //or std::vector
    //or unsigned char *output = new unsigned char[filesize];
    if(DataFile.read((char*)output, filesize))
    {
        std::ofstream fout("def.jpeg", std::ios::binary);
        if(!fout.good())
            return 0;
        fout.write((char*)output, filesize);
    }

    return 0;
}
0 голосов
/ 09 ноября 2018

В показанном коде несколько проблем.

while(!DataFile.eof()){

Это всегда ошибка . См. Связанный вопрос для подробного объяснения.

    DataFile >> output[i];

Оператор форматированного извлечения >> по определению пропускает все пробельные символы и игнорирует их. Ваш файл jpg наверняка имеет байты 0x09, 0x20 и несколько других, где-то в нем, и это автоматически пропускает и не читает их.

Чтобы сделать это правильно, вам нужно использовать read () и gcount () для чтения вашего двоичного файла. Правильное использование gcount() также должно привести к тому, что ваш код будет правильно определять условие конца файла.

...