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

Работа с изображениями (считать/вывести) - C++

Восстановить пароль Регистрация
 
napster1991
2 / 2 / 0
Регистрация: 12.03.2012
Сообщений: 33
13.11.2012, 21:12     Работа с изображениями (считать/вывести) #1
Необходимо считать изображение формата bmp. Нужно получить доступ к каждому пикселу и сохранить значение цвета этих пикселов в матрице m*n (размеры изображения). Далее, поменяв значение некоторых ячеек матрицы (фактически поменяв цвет пиксела), вывести в отдельный файл измененное изображение.

пока гуглил, наткнулся на OpenCV. скачал, но установить не смог. нормальную инструкцию не нашел.
заранее всем спасибо...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
13.11.2012, 21:20     Работа с изображениями (считать/вывести) #2
http://ru.wikipedia.org/wiki/BMP
napster1991
2 / 2 / 0
Регистрация: 12.03.2012
Сообщений: 33
13.11.2012, 21:58  [ТС]     Работа с изображениями (считать/вывести) #3
Цитата Сообщение от Croessmah Посмотреть сообщение
возникли первые вопросы:

1) не понятна первая строчка:
/* Компилируется строкой: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */

2) компилятор ругается, что нижеперечисленных файлов не существует
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>


PS: я работаю на VS 2008 (это на всякий случай )

#include <sys/stat.h>
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
13.11.2012, 22:03     Работа с изображениями (считать/вывести) #4
там описан сам формат BMP и структуры BITMAPFILEHEADER, BITMAPINFOHEADER. Изучайте.
А просто "копипастить" бесполезно.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
13.11.2012, 22:15     Работа с изображениями (считать/вывести) #5
Цитата Сообщение от napster1991 Посмотреть сообщение
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
Цитата Сообщение от napster1991 Посмотреть сообщение
VS 2008
Не взлетит, это для иксов, в виндах такого нет.
rinat_w
89 / 85 / 4
Регистрация: 13.11.2011
Сообщений: 183
14.11.2012, 00:04     Работа с изображениями (считать/вывести) #6
Только сегодня разбирался в формате bmp, если это чем нибудь тебе поможет:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <fstream>
#include <ctime>
using namespace std;
 
const int height = 480, width = 640;
char image[height][width][3];
char bgcolor[3] = {32, 64, 128}; // фон
char rgb[3] = {0, 0, 0};
ofstream file("3.bmp");
 
void drawRect(int, int, int, int);
void createFile();
void paint_and_close();
void setColor(char, char, char);
void drawPoint(int, int);
void manyPoints(double);
 
int main()
{
    createFile();
    
    // рисуем рандомные прямоугольники
    srand(time(0));
    int x1, y1;
    for (int i = 0; i < 10; i++)
    {
        x1 = abs(rand()%width);
        y1 = abs(rand()%height);
        setColor(abs(rand()%256), abs(rand()%256), abs(rand()%256));
        drawRect(x1, y1, abs(rand()%(width - x1)), abs(rand()%(height - y1)));
    }
    // точка
    setColor(128, 128, 128);
    drawPoint(120, 130);
    
    paint_and_close();
    return 0;
}
 
void drawRect(int x, int y, int w, int h)
{
     for (int i = x; i < x + w && i < width; i++)
     {
         for (int j = 0; j < 3; j++)
         {
             image[y][i][j] = rgb[j];
             if (y + h - 1 < height) image[y + h - 1][i][j] = rgb[j];
         }
     }
     for (int i = y; i < y + h && i < height; i++)
     {
         for (int j = 0; j < 3; j++)
         {
             image[i][x][j] = rgb[j];
             if (x + w - 1 < width) image[i][x + w - 1][j] = rgb[j];
         }
     }
}
void drawPoint(int x, int y)
{
     if (x < width && y < height)
        for (int i = 0; i < 3; i++)
            image[y][x][i] = rgb[i];
}
void manyPoints(double percent)
{
     for (int i = 0; i < height; i++)
         for (int j = 0; j < width; j++)
             if (double(abs(rand()%100)) < percent)
                for (int k = 0; k < 3; k++)
                    image[i][j][k] = 0;
}
void createFile()
{
     ifstream in("1.bmp");
     char ch;
     for (int i = 0; i < 54; i++) file.put((ch = in.get()));
     for (int i = 0; i < height; i++)
         for (int j = 0; j < width; j++)
             for (int k = 0; k < 3; k++)
                 image[i][j][k] = bgcolor[k];
     in.close();
}
void paint_and_close()
{
     for (int i = height - 1; i >= 0; i--)
         for (int j = 0; j < width; j++)
             for (int k = 2; k >= 0; k--)
                 file.put(image[i][j][k]);
     file.close();
}
void setColor(char r, char g, char b)
{
     rgb[0] = r;
     rgb[1] = g;
     rgb[2] = b;
}
Было лень до конца разбираться в структуре файла bmp, поэтому программа работает не совсем как надо.
Если хочешь создать и редактировать программно картинку M * N, то тебе надо будет создать 24 разрядную bmp картинку в пэинте размером M * N и сохранить в папку с программой под именем "1.bmp", далее меняешь переменные height = M и width = N, далее в функции main() редактируешь что надо, на выходе готовая "3.bmp" картинка.

Если поймешь как работает моя программа, надеюсь найдешь вопрос на свой ответ.
Миниатюры
Работа с изображениями (считать/вывести)  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 20:13     Работа с изображениями (считать/вывести)
Еще ссылки по теме:

C++ Работа с изображениями
Работа с изображениями (считать значение пикселя в виде RGB, не используя средства ОС) C++
Работа с изображениями C++

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

Или воспользуйтесь поиском по форуму:
napster1991
2 / 2 / 0
Регистрация: 12.03.2012
Сообщений: 33
16.11.2012, 20:13  [ТС]     Работа с изображениями (считать/вывести) #7
rinat_w,

Спасибо огромнейшее!!! После двух суток разбора твоего кода я получил то, что хотел!!! RESPECT тебе!!!
Yandex
Объявления
16.11.2012, 20:13     Работа с изображениями (считать/вывести)
Ответ Создать тему
Опции темы

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