Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/58: Рейтинг темы: голосов - 58, средняя оценка - 4.93
2 / 2 / 2
Регистрация: 31.07.2011
Сообщений: 143
1

bmp (24 битный)

10.11.2011, 20:03. Показов 10746. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят всем привет я бы выложил тут код,ну на самом деле с моей точки зрения это не к чему.Встала задача открыть 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,почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2011, 20:03
Ответы с готовыми решениями:

Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс "8 битное BMP изображение".Класс должен содержать 3 конструктора: конструктор по...

64 битный int
Здорова господа! Тут решаю задачку, нужно создать свой int для 64-битных целых. (размер допустим...

Компиляция в 16-битный код
Всем привет! Хочу с помощью GCC сгенерить ASM-файл с 16-битным кодом (типа как под DOS, а не...

Компиляция под 32 битный процессор
В общем название темы говорит само за себя. У меня стоит Win 7 64x разрядная и MS VS 2013. Когда я...

15
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
10.11.2011, 20:08 2
24 бита делим на 8, получаем 3 байта. Откуда должен взяться 4-й? Альфа-канал что ли?
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.11.2011, 20:11 3
Цитата Сообщение от aeshes Посмотреть сообщение
24 бита делим на 8, получаем 3 байта. Откуда должен взяться 4-й? Альфа-канал что ли?
Глубина цвета (степень прозрачности)
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
10.11.2011, 20:20 4
Может, я что-то путаю, но на хранение прозрачности (именно ее обозвала альфа-каналом) надо еще 8 бит, и таким образом на пиксель будет приходится 32 бита, т.е. это уже не 24-битное изображение
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.11.2011, 20:23 5
aeshes, вы ничего не путаете, все верно. Просто можно упаковывать 4 или 3 составляющие цвета, например в 16 или 8 бит
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.11.2011, 20:31 6
Цитата Сообщение от ogcjm124 Посмотреть сообщение
Но возникает вопрос, когда дело доходит до графических данных.Как я понимаю палитра тут отсутсвует,а цвет каждого пикселя задаётся 4 байтами
Тремя. Иначе он был бы 32-х битным. А вот упакованы ли тройки подряд, или между ними есть незначащие четвёртые байты, я тебе не скажу.

Добавлено через 6 минут
Цитата Сообщение от Thinker Посмотреть сообщение
Глубина цвета (степень прозрачности)
Глубина цвета - это вообще количество бит для кодирования цвета.
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.11.2011, 20:33 7
Цитата Сообщение от taras atavin Посмотреть сообщение
Глубина цвета - это вообще количество бит для кодирования цвета.
Согласен, спутал терминологию.
0
2 / 2 / 2
Регистрация: 31.07.2011
Сообщений: 143
10.11.2011, 20:53  [ТС] 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
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
10.11.2011, 20:54 9
Цитата Сообщение от ogcjm124 Посмотреть сообщение
Да ребят попытался открыть 8 битный файл и оказывается он гораздо больше 24 битного.Это нормально?
Кажется, в 8-битном явно хранится таблица цветов (палитра). Наверное, он поэтому больше

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

Добавлено через 15 минут
ну неужели этого никто не знает?
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 03:27 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 запихивать введенные пользователем значения
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.11.2011, 12:03 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? С другими форматами не путаешь?
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 15:00 13
taras atavin, не знаю) прочитала об этом на вики. там написано:
"Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксел, максимальные размеры изображения 65535×65535 пикселов. Однако, глубина 2 бит официально не поддерживается."

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

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

Проверила в paint. Файл из 6 пикселей 24-битный имеет размер 78 байт. Файл 8-битный из тех же 6 пикселей имеет размер 1Кб
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.11.2011, 15:06 14
Цитата Сообщение от aeshes Посмотреть сообщение
старший байт не используется.
Даже так добавляется всего 256 байт.
Цитата Сообщение от aeshes Посмотреть сообщение
прочитала об этом на вики. там написано:
"Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксел
Я это тоже читал. Только я ни в одной софтине не видел 48-ми битных bmp.

Добавлено через 59 секунд
Цитата Сообщение от aeshes Посмотреть сообщение
Т.е., как я поняла, даже если у тебя в 8-мибитном рисунке всего три пиксела и один цвет, то палитра записывается целиком.
Конечно целиком. Только что это нафиг за рисунок в 3 пиксела?
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 15:18 15
taras atavin, в палитре на каждый цвет используется 4 байта, на 256 цветов - 1024 байта.
Рисунок в 3 пиксела был взят ТС, видимо, для проверки его программы, он где-то про это упоминал. Вот я и написала про 3 пиксела. Я свою тоже проверяла на маленьком рисунке, потому что проверять в пошаговой отладке рисунок 200х200 точек я б не осилила
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.11.2011, 15:33 16
А ты не путай проверку с назначением. Ты ещё txtшник с одним единственным символом раром сдави в самораспак, долго потом будешь удивляться, что он увеличился.
0
11.11.2011, 15:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2011, 15:33
Помогаю со студенческими работами здесь

Как загрузить 24-битный bitmap?
импортирую bitmap он преобразуется в 256... и еще : как оазложить COLORREF на состовляющие...

64-х битный свободный компилятор под windows
Здравствуйте, не могли бы вы рассказать мне где можно взять свободный компилятор языка С++ для...

Соединение двух 32 битных блоков в 64 битный и обратно
Есть переменная __unt64 и две переменных unsigned unsigned int. Могу ли я получить один 64 битный...

Можно ли для винды компилить 64-х битный натив?
Можно ли для винды компилить 64-х битный натив? Чем? Как?


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru