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

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

Войти
Регистрация
Восстановить пароль
 
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
#1

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

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

Ввод/вывод и обработка изображения - C++
Доброго времени суток. Помогите, пожалуйста. Поставили задачу взять 2 кадра (2 изображения формата BMP или JPG) и вычесть одно из...

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

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

обработка изображения - Visual C++
дело в следующем. это кусок рабочей программки,которая выводит BMP изображение. теперь нужно перевести его в градации серого и черно-белое....

Обработка изображения - PHP
Изображение загружается но ничего не обрабатывается, что можно сделать? &lt;html&gt; &lt;head&gt; &lt;title&gt;Результат загрузки файла&lt;/title&gt; ...

Обработка изображения - Delphi
Всем привет. Надо написать прогу обработки изображений и вот какая проблема. Надо чтобы из папки можно было выбрать несколько изображений,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
1914 / 599 / 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
1914 / 599 / 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
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 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
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,729
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     Обработка изображения
Еще ссылки по теме:

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

Обработка изображения - Visual C++
Добрый день. Есть 2 изображения (jpg): исходник и тот же самый исходник с красным маркером (точка). Нужно определить координаты этой точки....

Обработка изображения - PHP
$size = getimagesize($_FILES); $src=imagecreatefromjpeg($_FILES); $znak_hw = getimagesize($host.'/impressions/watermark.png'); ...

Обработка изображения - MathCAD
Добрый день, форумчане! Подскажите пожалуйста, как правильно построить модель фильтра для монохромного рисунка, импульсный оклик...


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

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

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