Запись массива в растровое изображение C++

У меня снова проблемы с записью массива в растровое изображение, поэтому в основном я читаю данные из файла .bmp, где я получаю данные пикселей, и я хочу сделать B и R = 0, поэтому вот мой код:

int row_padded = ( Picture.biWidth*3 + 3) & (~3);
unsigned char* data = new unsigned char [row_padded];
unsigned char tmp;
 for(int i = 0; i < Picture.biHeight; i++)
{
    fread(data, sizeof(unsigned char), row_padded, plik);
    for(int j = 0; j < Picture.biWidth*3; j += 3)
    {
        data[j] = 0;
        data[j+2] = 0;

    }
}

Теперь, когда у меня B и R = 0, я хочу снова сохранить его в тот же файл, поэтому использую:

for(int j = 0; j< Picture.biHeight; j++)
{
    fwrite(data,1,Picture.biWidth, f);
}

но ничего не работает.

Вы удерживаете в памяти только одну строку развертки, поэтому вам придется искать и записывать ее, прежде чем читать следующую строку. В противном случае вы напишете много копий последней строки.

Ben Voigt 30.12.2018 20:23

хорошо, так что ты имеешь в виду, мне нужно использовать fseek, чтобы перейти в место "Смещение", а затем начать писать свой файл, верно? Но что, мне нужно делать это в цикле и каждый раз возвращаться в место смещения? Я прав?

kinket123 30.12.2018 23:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
195
1

Ответы 1

fwrite(data,1,Picture.biWidth, f) должен быть fwrite(data,1,row_padded, f) нет? иначе записывается только первая треть байтов

примечание: по определению sizeof(unsigned char) равен 1

не работает, я открываю такой файл: FILE * f = fopen ("test.bmp", "r + b");

kinket123 30.12.2018 20:16

@ kinket123 ты под виндой? в этом случае вам также нужно добавить 'b', чтобы открыть файл записи ("ш + б"). Размер входного и выходного файлов должен быть одинаковым, так ли?

bruno 30.12.2018 20:24

Есть несколько форматов для файлов BMP. Вы уверены, что входной файл имеет размер 24 бита / 1 байт на цвет?

bruno 30.12.2018 20:30

да, я под Windows, но если я изменю r + b на w + b, он не читает данные об этом bmp файле (заголовок растрового файла и т. д.)

kinket123 30.12.2018 21:42

вы не можете открыть в "w + b" для чтения, я просто сказал, что если вам нужно открыть для чтения в двоичном формате (plik = fopen(<input bmp>, "r+b");, тогда вам также необходимо открыть для записи в двоичном формате (f = fopen(<output bmp>, "w+b");), чтение и запись симметричны

bruno 30.12.2018 22:44

Другие вопросы по теме