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

Обработка изображения - C++

Восстановить пароль Регистрация
 
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
04.03.2014, 18:29     Обработка изображения #1
C++
1
2
3
4
5
6
7
8
9
10
11
for(unsigned long int i = 0; i<c; ++i)
        {
            fread(&tempcolor, 1, sizeof(unsigned char), in);
            if(tempcolor==0)
            {
 
                fwrite(&color, sizeof(color), 1, in);
                fseek(in, 1, SEEK_CUR);
            }
 
        }
Господа программисты, помогите пожалуйста. Не могу разобраться, как сделать. Есть квадратик черного цвета размера 16*16 нарисованный в пейнте и сохраненный в bmp 256 цветов. Нужно цвет этого квадратика заменить на белый(любой другой). Если написать в цикле (с - это размер картинки) просто fwrite без fread, то все работает, а с fread не работает(( Подскажите, пожалуйста, что я не так делаю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 18:29     Обработка изображения
Посмотрите здесь:

Ввод/вывод и обработка изображения C++
C++ Динамические изображения С++
C++ сжатие изображения
Скроллинг изображения C++
C++ Загрузка изображения.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.03.2014, 18:46     Обработка изображения #2
C++
#include <stdio.h>
 
int main()
{
    FILE * file;
    int size;
    unsigned char * data;
    
    file = fopen("black.bmp", "rb");
    fseek(file, 0, SEEK_END);
    size = ftell(file);
    rewind(file);
    
    data = new unsigned char[size];
    fread(data, 1, size, file);
    for(int i = 54; i < size; i++) data[i] = 0xFF;
    fclose(file);
    
    file = fopen("white.bmp", "wb");
    fwrite(data, 1, size, file);
    fclose(file);
    
    delete [] data;
}
Добавлено через 1 минуту
Ой, у меня меняет все изображение на белый.
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
04.03.2014, 18:53  [ТС]     Обработка изображения #3
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
int main()
{
    FILE* in;
    in = fopen("kv16bl.bmp","r+b");
     BitMapHeader bh;
     fread(&bh, 1, sizeof(BitMapHeader), in);
    int f = bh.biHeight;
    int color = 255;
    int tempcolor;
 
    unsigned long int c = pow(f,2);
    if(in!=NULL)
    {
        fseek(in, 1078, SEEK_SET);
        for(unsigned long int i = 0; i<c; ++i)
        {
            fread(&tempcolor, 0, sizeof(tempcolor), in);
 
            if(tempcolor==0)
            {
 
                fwrite(&color, sizeof(color), 1, in);
 
            }
 
        }
    }
    fclose(in);
    return 0;
 
}
А что не так именно в моей? просто она должна все делать именно в одном файле

Добавлено через 2 минуты
color и tempcolor не int а unsigned char надо
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.03.2014, 19:07     Обработка изображения #4
maxim12345, на самом деле bmp - очень плохой формат картинок, у них там размер файла не точно зависит от количества пикселей по ширине и высоте, хотя и считается растровым форматом. Обычно заголовок занимает 54 байта, а данные рисунка ширина * высота * кол-во_байт_на_пиксель, например для 24-битного рисунка 10 на 15 пикселей кол-во байт должно быть 54+10*15*3 = 504, а пейнт создает файл размером 534 байта, спрашивается откуда взялись еще 30 байтов...
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
04.03.2014, 19:21  [ТС]     Обработка изображения #5
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
int main()
{
    FILE* in;
    in = fopen("kv16bl.bmp","r+b");
     BitMapHeader bh;
     fread(&bh, 1, sizeof(BitMapHeader), in);
    int f = bh.biHeight;
    unsigned char color = 254;
    unsigned char tempcolor  ;
 
    unsigned long int c = pow(f,2);
    if(in!=NULL)
    {
        fseek(in, 1078, SEEK_SET);
        for(unsigned long int i = 0; i<c; ++i)
        {
            fread(&tempcolor, 0, sizeof(tempcolor), in);
            fseek(in, -1, SEEK_SET);
 
            if(tempcolor==25)
            {
 
                fwrite(&color, sizeof(color), 1, in);
 
            }
 
        }
 
 
    }
    fclose(in);
    return 0;
 
}
а вот в таком варианте программа перекрашивает квадратик, но только если сообщить переменной tempcolor заранее цвет. получается что fread не считывает цвет сама? что вообще тут не так? помогите, пожалуйста, поправить
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,168
Завершенные тесты: 1
04.03.2014, 21:07     Обработка изображения #6
1.
Цитата Сообщение от maxim12345 Посмотреть сообщение
if(tempcolor==25)
А почему Вы решили, что там должно быть 25?
Яркости в 256 цветной bmp записываются через палитру,
и то, что вы считываете, это не яркрсть, а индекс в этой палитре.
2. Я не знаю, что такое BitMapHeader.
В файл сначала пишется структура BITMAPFILEHEADER,
потом структура BITMAPINFO (содержащая BITMAPINFOHEADER и палитру),
а потом байты индексов, причем, строки выровнены на границу двойного слова.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
04.03.2014, 21:18     Обработка изображения #7
Цитата Сообщение от programina Посмотреть сообщение
на самом деле bmp - очень плохой формат картинок, у них там размер файла не точно зависит от количества пикселей по ширине и высоте, хотя и считается растровым форматом. Обычно заголовок занимает 54 байта, а данные рисунка ширина * высота * кол-во_байт_на_пиксель, например для 24-битного рисунка 10 на 15 пикселей кол-во байт должно быть 54+10*15*3 = 504, а пейнт создает файл размером 534 байта, спрашивается откуда взялись еще 30 байтов...
Вопрос даже не в том, что это плохой но простыми подручными средствами не заменишь, а писать свой компрессор (под jpg например) и тешится и время жалко (по крайне мере мне, хотя есть задача где хотелсь бы использовать). А так, Марин, надеюсь что не против что по имени, в BMP не один заголовок, туда еще чуть-чуть мусора понапихать можно если не ошибаюсь
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
04.03.2014, 21:22     Обработка изображения #8
Цитата Сообщение от programina Посмотреть сообщение
24-битного рисунка 10 на 15 пикселей кол-во байт должно быть 54+10*15*3 = 504,
выравнивания не учитываешь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 22:39     Обработка изображения
Еще ссылки по теме:

Обработка двумерных массивов. Обработка матриц C++
Открытие Изображения в с++ C++
Поворот изображения C++

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

Или воспользуйтесь поиском по форуму:
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
04.03.2014, 22:39     Обработка изображения #9
maxim12345, сам в своё время по этим граблям потоптался. На самом деле нельзя сразу после записи делать чтение. Как и наоборот. Эти опреации обязательно должны перемежаться вызовом fseek. Даже если указатель реально не должен перемещаться. Это прямо написано в документации.
Yandex
Объявления
04.03.2014, 22:39     Обработка изображения
Ответ Создать тему
Опции темы

Текущее время: 09:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru