Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 19
1

Работа с пикселями, побитовое копирование

02.02.2015, 15:01. Показов 1413. Ответов 4
Метки нет (Все метки)

**Задание: Написать программу, осуществляющую побитовое копирование из одного изображения в другое. Изображение открывается через диалог открытия файла с расширением *.bmp. Копированию подлежит только одна из составляющих цвета (красная-зелёная-синяя).

Может кто что-нибудь подсказать по этой программе? Нигде ничего подобного не нашел. Заранее спасибо.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2015, 15:01
Ответы с готовыми решениями:

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

Побитовое копирование double
Доброго времени суток! Преамбула: В целях интеграции Lua в движок C++ пытаюсь написать класс...

Побитовое копирование рисунка
Есть задание на курсач: Разработать программу, демонстрирующую влияние установленного ...

работа с пикселями
Помогите с кодом. Требуется загрузить любое изображение в формате BMP, далее изображение делится по...

4
Модератор
Эксперт С++
11071 / 9128 / 5485
Регистрация: 18.12.2011
Сообщений: 24,399
02.02.2015, 16:01 2
24 битный bmp содержит заголовок файла BITMAPFILEHEADER
C++
1
2
3
4
5
6
7
typedef struct tagBITMAPFILEHEADER { 
  WORD    bfType; 
  DWORD   bfSize; 
  WORD    bfReserved1; 
  WORD    bfReserved2; 
  DWORD   bfOffBits; 
} BITMAPFILEHEADER;
Потом заголовок BITMAPINFOHEDER.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct tagBITMAPINFOHEADER{
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
} BITMAPINFOHEADER;
Их надо пропустить.
А потом идут строки изображения байтами
BRGBRG....BRGxxxx
BRGBRG....BRGxxxx
BRGBRG....BRGxxxx
....
xxxx - это дополнение строки до кратности 8 байтам.
Т.е. Вам надо брать каждый третий байт с учетом длины строки.
0
160 / 101 / 14
Регистрация: 17.10.2012
Сообщений: 488
02.02.2015, 16:31 3
Функция загрузки BMP24
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
int     image_load(FILE* file_handler, Image* image) {
 
    int result;
    uint32_t delta = 0;
    uint32_t i = 0;
 
    BMPHeader bmp_header;
    Size2i size = {0, 0};
    
    result = fread(&bmp_header, sizeof(BMPHeader), 1, file_handler);
    if( result != 1 ) {
        fwprintf_s(stderr, L"Unexpected end of file\n");
        return 0;
    }
    
    if(
        bmp_header.sig[0] != 'B'
        ||
        bmp_header.sig[1] != 'M'
        ) {
 
        fwprintf_s(stderr, L"Thus file probably not bitmap image\n");
        return 0;
 
    }
 
    if( bmp_header.bit_per_pix != 24 )
        fwprintf_s(stderr, L"This format is unsupported, BMP24 only\n");
 
    size.height = bmp_header.height;
    size.width = bmp_header.width;
 
    if( !image_mem_alloc(image, size) ) {
        fwprintf_s(stderr, L"Malloc return NULL\n");
        return 0;
    }
 
    image->size = size;
 
    delta = _0(size.width);
 
    rewind(file_handler);
    fseek(file_handler, bmp_header.ptr_to_data, SEEK_CUR);
 
    for( i = 0; i < size.height; i++ ) {
 
        fread(
            &(image->matrix_ptr[ i * size.width ]),
            sizeof(BGRComponents),
            size.width,
            file_handler
            );
 
        fseek(file_handler, (int)delta, SEEK_CUR);
 
    }
 
    fclose(file_handler);
 
    return 1;
 
}
Функция копирования
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
int     image_clone(Image* dst, Image* src) {
 
    Size2i i = {0, 0};
 
    if( !image_mem_alloc(dst, src->size) ) return 0;
 
    for( i.width = 0; i.width < src->size.width; i.width++ ) {
 
        for( i.height = 0; i.height < src->size.height; i.height++ ) {
 
            image_write_at(
                dst,
                image_read_at( src, i.width, i.height ),
                i.width,
                i.height
                );
 
        }
 
    }
 
    return 0;
 
}
Остальной код с описанием лежит здесь.
Непонятно, что значит "Копированию подлежит только одна из составляющих цвета (красная-зелёная-синяя)". А что делать с остальными компонентами? Заполнить их конкретным цветом? И зачем их побитово копировать?
1
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 19
02.02.2015, 18:49  [ТС] 4
не могу понять как фото залить сюда,показал бы что должно получиться.
0
Модератор
Эксперт С++
11071 / 9128 / 5485
Регистрация: 18.12.2011
Сообщений: 24,399
02.02.2015, 19:12 5
Цитата Сообщение от feofun Посмотреть сообщение
как фото залить сюда
Расширенный режим->Управление вложениями.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2015, 19:12

c# работа с пикселями.
бешеный проблема. Очень надо добить эту программу. Тут работа с изображениями, суть в том, что...

Работа с пикселями
Возможно ли работать с пикселями в С++? Сравнение цветов пикселей требуется Добавлено через 2...

Работа с пикселями
Я только осваиваюсь с графикой, но пока ниче не получается...Если Вам не трудно, то помогите с этой...

Работа с пикселями в C#
Здравствуйте. Имеется приложение на C#, которое берет изображение с веб-камеры в PictureBox. На...


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

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

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