Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
1

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

04.03.2014, 18:29. Просмотров 506. Ответов 8
Метки нет (Все метки)

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 не работает(( Подскажите, пожалуйста, что я не так делаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 18:29
Ответы с готовыми решениями:

Ввод/вывод и обработка изображения
Доброго времени суток. Помогите, пожалуйста. Поставили задачу взять 2 кадра...

Обработка матрицы, каждый элемент которой задает яркость пикселя изображения
Матрица, каждый элемент которой является уровнем интенсивности пикселя...

Обработка изображения
Здравствуйте. В С программировать начал недавно. Необходимо реализовать...

Обработка изображения
Имеется в Paint.Net и в фотошопе такая функция (в Paint.Net называется...

Обработка изображения
Изображение загружается но ничего не обрабатывается, что можно сделать? ...

8
programina
2052 / 607 / 41
Регистрация: 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 минуту
Ой, у меня меняет все изображение на белый.
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 надо
0
programina
2052 / 607 / 41
Регистрация: 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 байтов...
1
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 не считывает цвет сама? что вообще тут не так? помогите, пожалуйста, поправить
0
zss
Модератор
Эксперт С++
7366 / 6772 / 4284
Регистрация: 18.12.2011
Сообщений: 17,899
Завершенные тесты: 1
04.03.2014, 21:07 6
1.
Цитата Сообщение от maxim12345 Посмотреть сообщение
if(tempcolor==25)
А почему Вы решили, что там должно быть 25?
Яркости в 256 цветной bmp записываются через палитру,
и то, что вы считываете, это не яркрсть, а индекс в этой палитре.
2. Я не знаю, что такое BitMapHeader.
В файл сначала пишется структура BITMAPFILEHEADER,
потом структура BITMAPINFO (содержащая BITMAPINFOHEADER и палитру),
а потом байты индексов, причем, строки выровнены на границу двойного слова.
0
mustimur
268 / 222 / 72
Регистрация: 22.11.2013
Сообщений: 836
Записей в блоге: 1
04.03.2014, 21:18 7
Цитата Сообщение от programina Посмотреть сообщение
на самом деле bmp - очень плохой формат картинок, у них там размер файла не точно зависит от количества пикселей по ширине и высоте, хотя и считается растровым форматом. Обычно заголовок занимает 54 байта, а данные рисунка ширина * высота * кол-во_байт_на_пиксель, например для 24-битного рисунка 10 на 15 пикселей кол-во байт должно быть 54+10*15*3 = 504, а пейнт создает файл размером 534 байта, спрашивается откуда взялись еще 30 байтов...
Вопрос даже не в том, что это плохой но простыми подручными средствами не заменишь, а писать свой компрессор (под jpg например) и тешится и время жалко (по крайне мере мне, хотя есть задача где хотелсь бы использовать). А так, Марин, надеюсь что не против что по имени, в BMP не один заголовок, туда еще чуть-чуть мусора понапихать можно если не ошибаюсь
0
ValeryS
Модератор
7314 / 5557 / 704
Регистрация: 14.02.2011
Сообщений: 18,839
04.03.2014, 21:22 8
Цитата Сообщение от programina Посмотреть сообщение
24-битного рисунка 10 на 15 пикселей кол-во байт должно быть 54+10*15*3 = 504,
выравнивания не учитываешь
0
Black Fregat
2561 / 1313 / 354
Регистрация: 31.05.2009
Сообщений: 5,046
04.03.2014, 22:39 9
maxim12345, сам в своё время по этим граблям потоптался. На самом деле нельзя сразу после записи делать чтение. Как и наоборот. Эти опреации обязательно должны перемежаться вызовом fseek. Даже если указатель реально не должен перемещаться. Это прямо написано в документации.
0
04.03.2014, 22:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 22:39

Обработка изображения
Помогите пожалуйста перевести код из VS 2008 в VS 2010 С#.Обрабатываю...

Обработка изображения
Добрый день. Есть 2 изображения (jpg): исходник и тот же самый исходник с...

Обработка изображения
$size = getimagesize($_FILES); $src=imagecreatefromjpeg($_FILES); $znak_hw...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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