Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Демик
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
#1

Заменить определенный байты изображения - C++

22.10.2013, 16:43. Просмотров 280. Ответов 4
Метки нет (Все метки)

Здравствуйте, я хочу заменить определенный байты изображения, вроде бы по коду у меня все нормально, но похоже я что-то напутал с флагами при открытии и вместо изменения у меня происходит заполнение файла нулями с самого начала, причем именно нулями, хотя должны быть измененные байты. Подскажите пожалуйста, что у меня не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
void  CreateImage(string pathImage, string pathMessage)
{
    char image_b = NULL;
    char image_g = NULL;
    char message_b = NULL;
    int messageSize = GetFileSize(pathMessage);
    const int size = 1;
    ifstream image_r;
    ifstream message (pathMessage, ios::binary | ios::in);
    ofstream image_w; 
    int j = 0;
 
 
    for(int i = 0; i < (messageSize*3)+1; i+=3)
    {
        if (i == messageSize*3)
        {
            image_b = (image_b & 0xf0) | 0x00;
            image_g = (image_g & 0xf0)| 0x0f;
            image_w.open(pathImage, ios::binary | ios::out);
            image_w.seekp((55+i)*sizeof(char), std::ios::beg);
            image_w<<image_b;
            image_w.seekp((55+i+1)*sizeof(char), std::ios::beg);
            image_w<<image_g;
            image_w.close();
        } 
        else
        {
            message.seekg(j);
            message.get(message_b);
            image_r.open(pathImage, ios::binary | ios::in);
            image_r.seekg((55+i)*sizeof(char), std::ios::beg);
            image_r.get(image_b);
            image_r.seekg((55+i+1)*sizeof(char), std::ios::beg);
            image_r.get(image_g);
            image_r.close();
 
            image_b = (image_b & 0xf0)|((message_b & 0xf0) >> 4);
            image_g = (image_g & 0xf0)|(message_b & 0x0f);
 
            image_w.open(pathImage, ios::binary | ios::out);
            image_w.seekp((55+i)*sizeof(char), std::ios::beg);
            image_w<<image_b;
            image_w.seekp((55+i+1)*sizeof(char), std::ios::beg);
            image_w<<image_g;
            image_w.close();
            j++;
        }
        
    }
 
    message.close();
}
Добавлено через 2 часа 14 минут
Блин, ну а все таки, почему он перезаписывает файл, вместо того, что бы изменять указанные байты??
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 16:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заменить определенный байты изображения (C++):

Как заменить определенный символ на номера попорядку? - C++
Извините ели не туда написал. Есть документ в нем 9000 адресов с символом n. Как этот сделать так, чтобы символы поменялись на номера по...

Нужно считать данные из файла и заменить определенный текст на заданный - C++
Есть файл с таким содержимым: (в нем записаны вещ. числа) Пример: 1.000 1.111 2.222 3.333 4.444 5.555 6.555 4.333 3.333 4.444 6.666...

Упорядочить байты - C++
Помогите додумать. Нужны упорядочить байты в порядке возрастания количества еденичных битов в них(ввод в шестнадцетиричнйо системе). ...

Упаковка в байты - C++
Можно ли упаковать массив bitset допустим из 100 тысяч битов в байты, чтобы записать это дело в файл или можно записывать сразу в файл(но...

Первые байты - C++
Задача вот в чем, надо получить 3 первых байта из файла. Подскажите как это сделать ?

Поменять байты - C++
Есть задача: дано число long int получить другое число путем перестановки двух ПОСЛЕДНИХ байтов с двумя ПЕРВЫМИ байтами. void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
22.10.2013, 17:10 #2
C++
1
ofstream image_w;
открытие на перезапись
C++
1
2
ofstream myfile;
myfile.open ("example.bin", ios::out | ios::app | ios::binary);
открытие на дозапись
0
Демик
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
22.10.2013, 17:38  [ТС] #3
до запись происходит в конец файла?А если мне нужно в определенную позицию записать байт?

Добавлено через 23 минуты
Да, до запись происходит в конец файла, блин, как мне перезаписывать определенный байты?
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
22.10.2013, 19:39 #4
Цитата Сообщение от Демик Посмотреть сообщение
до запись происходит в конец файла?А если мне нужно в определенную позицию записать байт?

Добавлено через 23 минуты
Да, до запись происходит в конец файла, блин, как мне перезаписывать определенный байты?
почитайте книгу, например Прата.

Для вашей задачи
C++
1
2
3
fstream finout;     // read and write streams
    finout.open(file, 
           ios_base::in | ios_base::out | ios_base::binary);
1
Демик
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
22.10.2013, 20:37  [ТС] #5
Спасибо, прочитаю, а запись происходит так же?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2013, 20:37
Привет! Вот еще темы с ответами:

Различные байты - C++
помогите, организовать цикл в котором перебираются все возможные варианты байт!! т.е составить массив где первым байтом будет 0x00 а...

байты в строку - C++
как можно перевести 4 байта F1 08 25 12 а строку А1082512 ?

Достать байты из переменной - C++
есть некий класс\структура. Например: class CLScls { private: int a, b, c; char d; string str; ...

перевессти байты в слово - C++
привет)))есть массив байтов(шестнадцатеричный) 53 48 4f 52 54 и т.д., есть признак того, что этому массиву соответсвует либо int, либо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.10.2013, 20:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru