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

bmp (24 битный) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
ogcjm124
2 / 2 / 0
Регистрация: 31.07.2011
Сообщений: 143
10.11.2011, 20:03     bmp (24 битный) #1
Ребят всем привет я бы выложил тут код,ну на самом деле с моей точки зрения это не к чему.Встала задача открыть 24 битный bmp файл и перекрасить в др.цвет.С заголовками всё понятно.Но возникает вопрос, когда дело доходит до графических данных.Как я понимаю палитра тут отсутсвует,а цвет каждого пикселя задаётся 4 байтами (4 байт=0).Так вот создаю в paint bmp 1*1 (рисунок конечно же больше это для опыта)всё тут нормально,создаю рисунок, например, 1*3 и по идеи после структуры
C++
1
BITMAPINFOHEADER
должно быть ещё расположено 12 байт по 4 на каждый пиксель,но там их 18 и расположены они каким-то загадочным образом.Файл просматриваю в текстовом редакторе.
правильно ли я понимаю,что граф.данные должны располагаться следующим образом при размере 1*3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
1байт=синий
2байт=зелёный
3байт=красный
4байт=всегда 0
5байт=синий
6байт=зелёный
7байт=красный
8байт=всегда 0
9байт=синий
10байт=зелёный
11байт=красный
12байт=0
и т.д.
Как объяснить этот парадокс?

Добавлено через 59 секунд
НО в действительности это не так?

Добавлено через 11 минут
Ребят вообщем разобрался со всем,но осталось 2 вопроса:
1)Если я использую rgb для описание цветов пикселей в каждом 24 битном рисунке,то у меня ведь все равно под описание кажого пикселя должно отводиться 4 байт,последний 0,но у меня почему-то только 3,почему?
2)Ширина должна быть кратна 4 в противном случае ширина увеличивается до кратности 4,но как система узнает ,что пиксель с левыми параметрами,не надо отображать и что это вообще не пиксель а мусор?

Добавлено через 3 минуты
Ответ на 2 вопрос найден,вы только ответь если знаете,на этот вопрос
C++
1
1)Если я использую rgb для описание цветов пикселей в каждом 24 битном рисунке,то у меня ведь все равно под описание кажого пикселя должно отводиться 4 байт,последний 0,но у меня почему-то только 3,почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
10.11.2011, 20:08     bmp (24 битный) #2
24 бита делим на 8, получаем 3 байта. Откуда должен взяться 4-й? Альфа-канал что ли?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.11.2011, 20:11     bmp (24 битный) #3
Цитата Сообщение от aeshes Посмотреть сообщение
24 бита делим на 8, получаем 3 байта. Откуда должен взяться 4-й? Альфа-канал что ли?
Глубина цвета (степень прозрачности)
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
10.11.2011, 20:20     bmp (24 битный) #4
Может, я что-то путаю, но на хранение прозрачности (именно ее обозвала альфа-каналом) надо еще 8 бит, и таким образом на пиксель будет приходится 32 бита, т.е. это уже не 24-битное изображение
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.11.2011, 20:23     bmp (24 битный) #5
aeshes, вы ничего не путаете, все верно. Просто можно упаковывать 4 или 3 составляющие цвета, например в 16 или 8 бит
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.11.2011, 20:31     bmp (24 битный) #6
Цитата Сообщение от ogcjm124 Посмотреть сообщение
Но возникает вопрос, когда дело доходит до графических данных.Как я понимаю палитра тут отсутсвует,а цвет каждого пикселя задаётся 4 байтами
Тремя. Иначе он был бы 32-х битным. А вот упакованы ли тройки подряд, или между ними есть незначащие четвёртые байты, я тебе не скажу.

Добавлено через 6 минут
Цитата Сообщение от Thinker Посмотреть сообщение
Глубина цвета (степень прозрачности)
Глубина цвета - это вообще количество бит для кодирования цвета.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.11.2011, 20:33     bmp (24 битный) #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Глубина цвета - это вообще количество бит для кодирования цвета.
Согласен, спутал терминологию.
ogcjm124
2 / 2 / 0
Регистрация: 31.07.2011
Сообщений: 143
10.11.2011, 20:53  [ТС]     bmp (24 битный) #8
Так и быть скину код,вижу без этого не как.Ребят гляньте и наведите на мысль но не более)
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
#include <new.h>
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <conio.h>
using namespace std;
 
int main ()
{
    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;
    RGBQUAD *quad;
    RGBQUAD color;
    
    fstream bmp("bmp.bmp",ios::binary|ios::out|ios::in);
    if(!bmp){
        cout << "no open file\n";
        getch();
        exit(1);
    }
    
    bmp.read((char*)&bfh,sizeof(bfh));
    bmp.read((char*)&bih,sizeof(bih));
    bmp.seekg(sizeof(bfh) + bih.biSize, ios::beg); //строка не нужна но на всякий случай пусть будет
    
    int rgbBlue,rgbGreen,rgbRed;
    //почему-то когда пытаюсь записать данные нап прямую в color.rgbBlue и все отс.ошибка???
    cin >> rgbBlue;
    cin >> rgbGreen;
    cin >> rgbRed;
    
    color.rgbBlue=rgbBlue;
    color.rgbGreen=rgbGreen;
    color.rgbRed=rgbRed;
 
    int i;
    i=(bfh.bfSize-sizeof(bfh)-sizeof(bih));
    try{
        quad=new RGBQUAD[i];
        }catch (bad_alloc xa){
        exit(1);
    }
    //тут возникает вопрос недостающие байты до кратности 4 забивать мусором вручную 
    int n;
    for (n=0;n<=i;n++){
        quad[n]=color;
    }
    bmp.write((const char *)quad,i);
    //получатся полосатая картинка
    bmp.close();
    
    getch ();
    return 0;
}
Добавлено через 1 минуту
Да ребят попытался открыть 8 битный файл и оказывается он гораздо больше 24 битного.Это нормально?

Добавлено через 6 минут
Как создать в windows 40 битный bmp
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
10.11.2011, 20:54     bmp (24 битный) #9
Цитата Сообщение от ogcjm124 Посмотреть сообщение
Да ребят попытался открыть 8 битный файл и оказывается он гораздо больше 24 битного.Это нормально?
Кажется, в 8-битном явно хранится таблица цветов (палитра). Наверное, он поэтому больше

Цитата Сообщение от ogcjm124 Посмотреть сообщение
Как создать в windows 40 битный bmp
Разве такой есть? Вроде после 32-битного сразу идет 48-битный
ogcjm124
2 / 2 / 0
Регистрация: 31.07.2011
Сообщений: 143
10.11.2011, 21:18  [ТС]     bmp (24 битный) #10
а с кодом строки что в ручную выравнивать,он автоматом туда мусор разве не пишет?

Добавлено через 15 минут
ну неужели этого никто не знает?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 03:27     bmp (24 битный) #11
Вот код, который красит картинку целиком в заданный пользователем цвет
Нули дописываются вручную
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
#include <iostream>
#include <windows.h>
#include <fstream>
#include <conio.h>
using namespace std;
 
int main ()
{
        BITMAPFILEHEADER bfh;
        BITMAPINFOHEADER bih;
        RGBQUAD color;
        
        fstream bmp("bmp.bmp",ios::binary|ios::out|ios::in);
        if(!bmp){
                cout << "no open file\n";
                getch();
                exit(1);
        }
        
        bmp.read((char*)&bfh,sizeof(bfh));
        bmp.read((char*)&bih,sizeof(bih));
        bmp.seekg(sizeof(bfh) + bih.biSize, ios::beg); 
        int rgbBlue, rgbGreen, rgbRed;
        cin >> rgbBlue;
        cin >> rgbGreen;
        cin >> rgbRed;
        color.rgbBlue=rgbBlue;
        color.rgbGreen=rgbGreen;
        color.rgbRed=rgbRed;
        int zeron=0; //количество нулей, которыми надо дополнить строку
        if(bih.biWidth%4) zeron=bih.biWidth%4; 
        int n;char temp[4];
        for (n=1;n<=bih.biWidth*bih.biHeight;n++)
       {
    temp[0]=color.rgbBlue;
    temp[1]=color.rgbGreen;
    temp[2]=color.rgbRed;
    temp[3]=0;
    bmp.write(temp,3);
    if(n%bih.biWidth==0)
    {
          for(int j=0;j<zeron;j++)
        bmp.write("\0",1);
    }
        }
        bmp.close();     
        getch ();
        return 0;
}
хотя тут можно было обойтись и без color, а сразу в temp запихивать введенные пользователем значения
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.11.2011, 12:03     bmp (24 битный) #12
Цитата Сообщение от aeshes Посмотреть сообщение
Кажется, в 8-битном явно хранится таблица цветов (палитра). Наверное, он поэтому больше
Палитра весит 24 бита на цвет. Раз файл 8-ми битный, значит цветов 256. Итого 6 144 бит. А рисунок весит 8 бит на пиксель, даже если он 256*256, это уже 65 536 пискселей, итого 524 288 бит. Разница 85-ти кратная. А в 24-х битном файле, хоть и нет палитры, зато сам рисунок весит в три раза больше, при том же размере 256*256 он будет уже 1 572 864 бит. Сколько весят заголовок палитры и поле для него в заголовке файла? Даже если в сумме 64 байта, то это всего 512 бит, вместе с самой палитрой будет 6 208. Это всё равно в 84 раза меньше самого рисунка, даже 8-ми битного.

Добавлено через 3 минуты
Цитата Сообщение от ogcjm124 Посмотреть сообщение
Как объяснить этот парадокс?
Не вижу парадокса.

Добавлено через 5 часов 4 минуты
Цитата Сообщение от aeshes Посмотреть сообщение
Вроде после 32-битного сразу идет 48-битный
bmp? С другими форматами не путаешь?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 15:00     bmp (24 битный) #13
taras atavin, не знаю) прочитала об этом на вики. там написано:
"Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксел, максимальные размеры изображения 65535×65535 пикселов. Однако, глубина 2 бит официально не поддерживается."

И там же
"Палитра может содержать последовательность четырёхбайтовых полей по числу доступных цветов (256 для 8-битного изображения). Три младшие байта каждого поля определяют интенсивность красной, зелёной и синей компоненты цвета, старший байт не используется. Каждый пиксел изображения описан в таком случае одним байтом, содержащим номер поля палитры, в котором сохранен цвет этого пиксела."

Т.е., как я поняла, даже если у тебя в 8-мибитном рисунке всего три пиксела и один цвет, то палитра записывается целиком. Могу ошибаться.

Проверила в paint. Файл из 6 пикселей 24-битный имеет размер 78 байт. Файл 8-битный из тех же 6 пикселей имеет размер 1Кб
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.11.2011, 15:06     bmp (24 битный) #14
Цитата Сообщение от aeshes Посмотреть сообщение
старший байт не используется.
Даже так добавляется всего 256 байт.
Цитата Сообщение от aeshes Посмотреть сообщение
прочитала об этом на вики. там написано:
"Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксел
Я это тоже читал. Только я ни в одной софтине не видел 48-ми битных bmp.

Добавлено через 59 секунд
Цитата Сообщение от aeshes Посмотреть сообщение
Т.е., как я поняла, даже если у тебя в 8-мибитном рисунке всего три пиксела и один цвет, то палитра записывается целиком.
Конечно целиком. Только что это нафиг за рисунок в 3 пиксела?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 15:18     bmp (24 битный) #15
taras atavin, в палитре на каждый цвет используется 4 байта, на 256 цветов - 1024 байта.
Рисунок в 3 пиксела был взят ТС, видимо, для проверки его программы, он где-то про это упоминал. Вот я и написала про 3 пиксела. Я свою тоже проверяла на маленьком рисунке, потому что проверять в пошаговой отладке рисунок 200х200 точек я б не осилила
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 15:33     bmp (24 битный)
Еще ссылки по теме:

Соединение двух 32 битных блоков в 64 битный и обратно C++
64-х битный свободный компилятор под windows C++
C++ Компиляция под 32 битный процессор

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.11.2011, 15:33     bmp (24 битный) #16
А ты не путай проверку с назначением. Ты ещё txtшник с одним единственным символом раром сдави в самораспак, долго потом будешь удивляться, что он увеличился.
Yandex
Объявления
11.11.2011, 15:33     bmp (24 битный)
Ответ Создать тему
Опции темы

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