Как рассчитать размер графического файла bmp

Обновлено: 04.07.2024

Расчёт информационного объёма растрового графического изображения (количества информации, содержащейся в графическом изображении) основан на подсчёте количества пикселей в этом изображении и на определении глубины цвета (информационного веса одного пикселя).

Итак, для расчёта информационного объёма растрового графического изображения используется формула (3):

где Vpic – это информационный объём растрового графического изображения, измеряющийся в байтах, килобайтах, мегабайтах; K – количество пикселей (точек) в изображении, определяющееся разрешающей способностью носителя информации (экрана монитора, сканера, принтера); i – глубина цвета, которая измеряется в битах на один пиксель; kсжатия – коэффициент сжатия данных, без сжатия он равен 1.

Глубина цвета задаётся количеством битов, используемым для кодирования цвета точки. Глубина цвета связана с количеством отображаемых цветов формулой
N=2 i , где N – это количество цветов в палитре, i – глубина цвета в битах на один пиксель.

1) В результате преобразования растрового графического изображения количество цветов уменьшилось с 256 до 16. Как при этом изменится объем видеопамяти, занимаемой изображением?

N1 = 256 = 2 8 ; i1 = 8 бит/пиксель

N2 = 16 = 2 4 ; i2 = 4 бит/пиксель

Ответ: объём графического изображения уменьшится в два раза.

2) Сканируется цветное изображение стандартного размера А4 (21*29,7 см). Разрешающая способность сканера 1200dpi и глубина цвета 24 бита. Какой информационный объём будет иметь полученный графический файл?

Дано:
i = 24 бита на пиксель;
S = 21см*29,7 см
D = 1200 dpi (точек на один дюйм)

Используем формулы
V = K*i;

S = (21/2,54)*(29,7/2,54) = 8,3дюймов*11,7дюймов

K = 1200*8,3*1200*11,7 = 139210118 пикселей

V = 139210118*24 = 3341042842бита = 417630355байт = 407842Кб = 398Мб

Ответ: объём сканированного графического изображения равен 398 Мегабайт

Расчёт иформационного объема аудио-файла

Расчёт информационного объёма аудио-файла можно производить по следующей формуле (4):

Vaudio = D * T * nканалов * i / kсжатия , (4)

где V – это информационный объём аудио-файла, измеряющийся в байтах, килобайтах, мегабайтах; D – частота дискретизации (количество точек в секунду для описания аудио-записи); T – время аудио-файла; nканалов – число каналов аудио-файла (стерео — 2 канала, система 5.1 — 6 каналов); i – глубина звука, которая измеряется в битах, kсжатия – коэффициент сжатия данных, без сжатия он равен 1.

Расчёт иформационного объема анимации

Расчёт информационного объёма анимации можно производить по следующей формуле (5):

Vanim = K * T * v * i / kсжатия , (5)

где Vanim – это информационный объём растрового графического изображения, измеряющийся в байтах, килобайтах, мегабайтах; K – количество пикселей (точек) в изображении, определяющееся разрешающей способностью носителя информации (экрана монитора, сканера, принтера); T – время анимации; v – частота смены кадров в секунду; i – глубина цвета, которая измеряется в битах на один пиксель, kсжатия – коэффициент сжатия данных, без сжатия он равен 1.

Расчёт иформационного объема видео-файла

Расчёт информационного объёма видео-файла можно производить по следующей формуле (5):

где Vvideo – это информационный объём видео-файла, измеряющийся в байтах, килобайтах, мегабайтах; Vanim – это информационный объём анимации (видео-ряда), измеряющийся в байтах, килобайтах, мегабайтах; Vaudio – это информационный объём аудео-файла, измеряющийся в байтах, килобайтах, мегабайтах (в видео-ролике могут содержатся файлы аудио-дорожек для нескольких языков, тогда умножаем объем аудио-файла на количество языковых дорожек); Vsub – это информационный объём файла субтитров, измеряющийся в байтах, килобайтах, мегабайтах (если несколько файлов субтитров, то надо сложить размеры каждого файла).

Практическая часть

2. Рассчитать размер видео-файла с указанными параметрами (по вариантам).

Расчёт информационного объёма растрового графического изображения (количества информации, содержащейся в графическом изображении) основан на подсчёте количества пикселей в этом изображении и на определении глубины цвета (информационного веса одного пикселя).

При расчетах используется формула V = i * k,

где V – это информационный объём растрового графического изображения, измеряющийся в байтах, килобайтах, мегабайтах;

k – количество пикселей (точек) в изображении, определяющееся разрешающей способностью носителя информации (экрана монитора, сканера, принтера);

i – глубина цвета, которая измеряется в битах на один пиксель.

Глубина цвета задаётся количеством битов, используемым для кодирования цвета точки.

Глубина цвета связана с количеством отображаемых цветов формулой

N = 2 i , где N – это количество цветов в палитре, i – глубина цвета в битах на один пиксель.

Примеры

1. Видеопамять компьютера имеет объем 512Кб, размер графической сетки 640×200, в палитре 8 цветов. Какое количество страниц экрана может одновременно разместиться в видеопамяти компьютера?

Найдем количество пикселей в изображении одной страницы экрана:

k = 640*200=128000 пикселей.

Найдем i (глубину цвета, т.е. сколько бит потребуется для кодировки одного цвета) N = 2 i , следовательно, 8 = 2 i , i = 3.

Находим объем видеопамяти, необходимый для размещения одной станицы экрана. V = i * k (бит), V = 3*128000 = 384000(бит) = 48000 (байт) = 46,875Кб.

Ответ: 10 полных страниц экрана можно одновременно хранить в видеопамяти компьютера

2. В результате преобразования растрового графического изображения количество цветов уменьшилось с 256 до 16. Как при этом изменился объем видеопамяти, занимаемой изображением?

Используем формулы V = i * k и N = 2 i .

256 = 2 i1 , 16 = 2 i2 ,

Ответ: объём графического изображения уменьшится в два раза.

3. Сканируется цветное изображение стандартного размера А4 (21×29,7 см 2 ). Разрешающая способность сканера 1200dpi (точек на один дюйм) и глубина цвета 24 бита. Какой информационный объём будет иметь полученный графический файл?

i=24 бита на пиксель;

Используем формулу V = i * k

V=139210118*24 = 3341042842 (бита) = 417630355байт = 407842Кб = 398Мб

Ответ: объём сканированного графического изображения равен 398 Мб

Задачи для самостоятельного решения

1. Определите количество цветов в палитре при глубине цвета 4, 8, 16, 24, 32 бита.

2. В процессе преобразования растрового графического изображения количество цветов уменьшилось с 65536 до 16. Во сколько раз уменьшится информационный объем файла?

3. 256-цветный рисунок содержит 120 байт информации. Из скольких точек он состоит?

4. Достаточно ли видеопамяти объёмом 256 Кбайт для работы монитора в режиме 640×480 и палитрой из 16 цветов?

5. Какой объем видеопамяти необходим для хранения двух страниц изображения при условии, что разрешающая способность дисплея равна 640×350 пикселей, а количество используемых цветов – 16?

6. Какой объем видеопамяти необходим для хранения четырех страниц изображения, если битовая глубина равна 24, а разрешающая способность дисплея 800×600 пикселей?

7. Объем видеопамяти равен 2 Мб, битовая глубина 24, разрешающая способность дисплея 640×480. Какое максимальное количество страниц можно использовать при этих условиях?

8. Видеопамять имеет объем, в котором может храниться 4-х цветное изображение размером 640×480. Какого размера изображение можно хранить в том же объеме видеопамяти, если использовать 256 – цветную палитру?

9. Для хранения растрового изображения размером 1024×512 отвели 256 Кб памяти. Каково максимальное возможное количество цветов в палитре изображения?

Задачи на расчет объёма звуковой информации

Теория

Звук может иметь различные уровни громкости. Количество различных уровней рассчитывается по формуле N = 2 i , где i - глубина звука.

Частота дискретизации - количество измерений уровня входного сигнала в единицу времени (за 1 секунду).

Размер цифрового моноаудиофайла вычисляется по формуле А=Д*Т*i,

где Д- частота дискретизации;

Т- время звучания или записи звука;

i - разрядность регистра (глубина звука).

Для стереоаудиофайла размер вычисляется по формуле А=2*Д*Т*i

Примеры

1. Подсчитать, сколько места будет занимать одна минута цифрового звука на жестком диске или любом другом цифровом носителе, записанного с частотой 44.1 кГц и разрядностью 16 бит.

Если записывают стереосигнал

А = 2*Д*Т*i = 44100*120*16 = 84672000бит = = 10584000байт = 10335,9375Кб = 10,094Мб.

Если записывают моносигнал А = 5Мб.

Ответ: 10 Мб, 5Мб

2. Объем свободной памяти на диске - 0,01 Гб, разрядность звуковой платы - 16. Какова длительность звучания цифрового аудиофайла, записанного с частотой дискретизации 44100 Гц.

Т = 10737418,24/44100/2 = 121,74(сек) = 2,03(мин)

Ответ: 2,03 мин.

Задачи для самостоятельного решения

1. Определить размер (в байтах) цифрового аудиофайла, время звучания которого составляет 10 секунд при частоте дискретизации 22,05 кГц и разрешении 8 бит. Файл сжатию не подвержен.

2. В распоряжении пользователя имеется память объемом 2,6 Мб. Необходимо записать цифровой аудиофайл с длительностью звучания 1 минута. Какой должна быть частота дискретизации и разрядность?

3. Объем свободной памяти на диске – 0,01 Гб, разрядность звуковой платы – 16. Какова длительность звучания цифрового аудиофайла, записанного с частотой дискретизации 44100 Гц?

4. Одна минута записи цифрового аудиофайла занимает на диске 1,3 Мб, разрядность звуковой платы – 8. С какой частотой записан звук?

При загрузке картинок в проект VB постоянно возникает проблема их вывода размером, удобным для просмотра. В большинстве примеров и статей, размещенных в глобальной сети, авторы ограничиваются установкой размеров Image или PictureBox'а равным размеру формы, видимо предполагая, что картинка не может быть размером более 1024 х 768 пикселей. Уверяю тебя, это предположение верно только для картинок, скаченных с Интернета. Обычные фотографии (сделанные не мобильником) значительно больше.

Для того, чтобы вывести фотографию любым, меньшим чем оригинал размером, достаточно установить свойство Image.Stretch=True. Тогда картинка впишется в рамки установленного размера Image. Проблема остается в том, что нарушается пропорция между шириной и длиной картинки и изображение искажается. Для того, чтобы избежать этого, надо заранее, перед загрузкой картинки в Image, знать реальный размер загружаемой картинки и установить Image.Width и Image.Hight пропорционально этим размерам. В главе 6 мы, для того, чтобы определить размер изображения использовали дополнительно элемент Picture. Загрузив картинку в Picture Мы по свойствам Picture.ScaleWidth и Picture.ScaleHight определяли реальный размер изображения и исходя из него, устанавливали размер Image. После этого копировали картинку из Picture в Image (или в другой Picture) с помощью метода PaintPicture. Желаемый результат, мы как говориться, в большинстве случаев получали. Однако, по-скольку работа с графикой не является сильным местом VB, этот процесс при значительных размерах картинки занимал достаточно много времени и отнимал много ресурсов. Например, на компьютере Pentium III 700Мгц c оперативной памятью 128 Мб под Win98 при размере файла картинки JPG более 1.2 мб этот процесс вообще не имел счастливого завершения и уменьшеной копии картинки из таких файлов я так и не увидел (причем что на Pentium IV 1500 Мгц и 256 Мб оперативки под Windows XP это работало).

Такое положение вещей приводит к логическому выводу: хорошо бы сразу знать размер графического изображения, не загружая файла, тогда можно будет выставить размер Image перед загрузкой картинки и будет нам счастье.
Даже не изучая вопроса графического хранения и сжатия информации ясно, что в файле картинки где-то черным по-белому прописан размер изображения. Нам надо только его найти и считать. Сразу скажу, что нашей целью не является подробный анализ внутренней структуры графических файлов и написание кодировщика-раскодировщика этих файлов. Наша цель - получить нужную нам информацию (конкретно - размер изображения). Мы попробуем по рабоче-крестьянски проанализировать три самых распространенных формата BMP, GIF и JPG (JFIF), при этом особо не напрягая наши драгоценные мозги. Для того, чтобы поработать с внутренним устройстом графических файлов нам понадобится шестнадцатеричный редактор. Если его нет под рукой, скачать простой бесплатный редактор можно здесь (507 kb). Если тебе все это лениво, то можешь просто воспользоваться результатами в виде готового кода (исходник вверху страницы).

Итак начнем с самого простого и приближенного к Windows:

Растровый файл BMP (Bitmap).

Этот формат является основным для Windows, так называемый Bitmap. Кроме того из него довольно-таки легко получить искомую нам информацию. Эти файлы обычно имеют расширение .bmp и используются Windows везде, где только возможно.
Структура файла такова, что нужная нам информация хранится в первых 54 байтах файла. Ниже представлена таблица с подробным представлением этих самых байт для файла BMP с размером изображения 719 х 781 пикселов.

Таблица заголовка BMP-файла.


Все это вы сможете увидеть, открыв какой-нибудь BMP-файл с помощью шестнадцатеричного редактора.
Естественно, для работы с основным виндусовым файлом предусмотрены широкие воможности, которые реализованы большим набором структур, которые обычно используются совместно с API-функциями: BITMAP, BITMAPCOREHEADER, BITMAPCOREINFO, BITMAPINFO, но нашу информацию о типе графического изображения можно получить с помощью структуры BITMAPFILEHEADER, а о размере - с помощью структуры BITMAPINFOHEADER. Ниже представлено их объявление и краткое описание.

Type BITMAPFILEHEADER '14 первых байт файла BMP
bfType As Integer 'символы "BM" (&H4D42 или 19778), обозначающие bmp-файл
bfSize As Long 'размер файла
bfReserved1 As Integer 'не используется, должно равнятся нулю
bfReserved2 As Integer 'не используется, должно равнятся нулю
bfOffBits As Long 'смещение графических данных от конца структуры
End Type


Type BITMAPINFOHEADER '40 байт - общие характеристики растра
biSize As Long 'размер структуры в байтах, всегда 40 байт
biWidth As Long 'ширина растра в пикселах
biHeight As Long 'высота растра в пикселах
biPlanes As Integer 'количество цветовых плоскостей - всегда 1
biBitCount As Integer 'задает количество бит на пиксел:
'1 - для монохромного растра
' 4 - для 16 цветов
' 8 - для 256 цветов
'16 - для 16-разрядных цветов RGB
'24 - для 24-разрядных цветов RGB
'32 - для 32-разрядных цветов RGB
biCompression As Long 'тип сжатия (если BI_RGB, то сжатие не используется)
biSizeImage As Long 'размер изображения в байтах
biXPelsPerMeter As Long 'количество пикселов на метр по-горизонтали, для DIB
biYPelsPerMeter As Long 'количество пикселов на метр по-вертикали, для DIB
biClrUsed As Long 'количество фактически используемых элементов в цветовой таблице DIP
biClrImportant As Long 'количество значащих элементов в таблице DIP
End Type

Реализуем это на практике. Создадим exe-проект, положим на форму Text1 и Command1. Добавим к проекту стандартный модуль и запишем в него объявления наших двух структур BITMAPFILEHEADER и BITMAPINFOHEADER. Можно скопировать прямо с этой страницы. Закроем стандартный модуль. И далее в форме в процедуре командной кнопки напишем код, позволяющий вывести в текстовое поле тип файла в виде десятичного числа 19778 (что соответствует &H4D42 или буквам BM), его размер в байтах, и ширину высоту графического изображения в пикселах.

На всякий случай скачать исходник этого кода можно здесь.

Однако с другими форматами не так все просто и структур для них в VB нету. И с ними придется работать собственными силами. Поэтому потренируемся на BMP, так как это самый простой формат по которому мы уже имеем кучу информации. Давайте реализуем ту же задачу не используя структур BITMAPFILEHEADER и BITMAPINFOHEADER. Не зря же я рисовал в начале таблицу структуры заголовка BMP-файла.
На самом деле все очень просто. Мы просто будем читать необходимые нам байты и обязательно в шестнадцатеричном представлении. Для полной ясности проговорим все пошагово. К исходнику примера приложен файл BMP, который называется "untitled.bmp" размером 80 768 байтов с графическим изображением 157 x 171 пиксель. Каким образом мы получаем эти данные?
Создадим новый exe-проект и положим на форму Text1 (Multiline=True) и Command1. Процедуру определения информации из BMP-файла пишем в командной кнопке.

С каждым тактом цикла в переменную b будет считываться один байт.Он будет в десятичной системе счисления (0, 1,59,128). Но из этого мы не можем получить число, соответствующее размеру файла. Нам нужны данные в шестнадцатеричной форме. Перевести можно с помощью функции Hex. Но этого недостаточно. Если у нас в байте было число, например 0D, то при переводе оно превратится в D, а это недопустимо, так как полностью исказит результат. Поэтому я здесь применил такую лихую формулу. Смысл ее в том, что в случае, если полученное шестнадцатеричное число состоит из одного знака, мы вперед добавляем ноль.

RazmF = RazmF & String((Len(Hex(b)) - 2) * -1, 0) & Hex(b)

Таким образом наши десятичные числа b преобразуются в строковые шестнадцатеричные и сцепляясь в переменной RazmF образуют строковое шестнадцатиричное число: RazmF = "00" & "01" & "3B" & "80" = "13B80" и это и есть искомый размер файла. Нам надо только перевести его в десятичную систему счисления. Для этого я сделал функцию ConvertDec() и поместил ее в стандартный модуль Модуль1. Подробное описание алгоритма и кода функции можно прочитать в статье "Шестнадцатеричное представление числа. Перевод из шестнадцатеричной системы счисления в десятичную ".

Теперь мы знаем, как получить прямой доступ к поверхности и что делать с ее памятью, чтобы изменить значения отдельных пикселей. Давайте используем полученные знания на практике. В этой главе мы напишем приложение DirectDraw для просмотра графических файлов формата BMP. Но перед тем как браться за такую программу, необходимо научиться загружать BMP-файлы.

Формат BMP-файлов

BMP — стандартный формат графических файлов Windows. Подавляющее большинство BMP-файлов хранится без сжатия, что облегчает работу с ними. Даже в сжатых BMP-файлах нет ничего особенно сложного, но мы ограничимся файлами без сжатия.

BMP-файлы состоят из трех основных частей:

  • заголовок;
  • палитра;
  • графические данные (значения пикселей).

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

Структура заголовка

Данные заголовка BMP-файла хранятся в двух структурах: BITMAPFILEHEADER и BITMAPINFOHEADER. Структура BITMAPFILEHEADER присутствует в начале любого BMP-файла и содержит информацию о самом файле. Для нас в этой структуре представляет интерес лишь одно поле — bfType, сигнатура BMP-файла (информацию об остальных полях можно найти в справочной системе Visual C++). В BMP-файлах это поле содержит буквы BM (обе буквы — прописные). По содержимому этого поля мы будем убеждаться в том, что выбранные файлы действительно имеют формат BMP.

Структура BITMAPINFOHEADER содержит информацию об изображении, хранящемся в BMP-файле. Эта структура объявляется так:

Первое поле, biSize, определяет размер структуры BITMAPINFOHEADER в байтах. Если ваша программа создает BMP-файл, это поле заполняется тривиально — достаточно определить размер структуры функцией sizeof. Однако при чтении BMP-файла по содержимому этого поля приходится рассчитывать позицию файла, на которой структура заголовка кончается. Эта мера обеспечивает обратную совместимость, благодаря ей Microsoft в будущем сможет увеличить размер структуры BITMAPINFOHEADER, не нарушая работы существующих приложений.

Лучше молчать и прослыть глупцом. Когда я только начал программировать для Windows, то не понимал, зачем в некоторые структуры включаются поля с их размерами. Забыв о мудром совете Авраама Линкольна, я высказался на эту тему в одной из ранних статей и был справедливо наказан. Впрочем, если бы все прислушались к совету Линкольна, никто бы не писал книг.

Поля biWidth, biHeight и biBitCount определяют размеры изображения. Содержимое поля biCompression позволяет узнать, хранится ли изображение в сжатом виде. Поскольку мы не собираемся работать со сжатыми BMP-файлами, необходимо проверить, имеет ли это поле значение BI_RGB (а не BI_RLE8, свидетельствующее о сжатии файла).

В поле biSizeImage хранится размер графических данных (в пикселях). Однако учтите, что это поле часто оказывается незаполненным (содержит нулевое значение). В таких случаях нам придется самостоятельно вычислять размер графических данных.

Палитра

Палитра в BMP-файлах хранится в виде списка структур RGBQUAD, где каждый элемент представляет отдельный цвет. Структура RGBQUAD объявляется так:

Графические данные

Графические данные в основном представляют собой список пикселей, из которых состоит изображение. Однако каждая горизонтальная строка пикселей должна занимать блок памяти, выровненный по границе параграфа. Следовательно, если количество байт, необходимых для хранения строки пикселей, не кратно четырем, в каждую строку включается от одного до трех дополняющих байт.

При этом для работы с графическими данными BMP-файлов используется концепция шага, упоминавшаяся выше в этой главе. Отличие состоит в том, что для графических данных BMP-файлов значение шага вам придется рассчитать самостоятельно. Впрочем, это не так уж сложно, потому что шаг всегда попадает на ближайшую границу параграфа за концом блока памяти, необходимого для хранения строки пикселей.

Изображения хранятся в BMP-файлах в перевернутом виде, так что первая строка пикселей файла на самом деле является нижней строкой настоящего изображения. Чтобы восстановить нормальное изображение, мы начнем чтение файла с последней строки пикселей и будем двигаться к началу.

Читайте также: