Как сделать картинку bitmap
Практический опыт работы с Bitmap средствами Android
Не так давно по долгу службы я столкнулся с одной задачей: нужно было придумать и реализовать дизайн медиа-плеера для Android. И если продумать и организовать более или менее сносное размещение элементов управления и информации оказалось делом не хитрым, то чтобы привнести в дизайн какую-то изюминку, пришлось хорошенько подумать. К счастью, в запасе у меня был такой элемент, как картинка с обложкой альбома проигрываемой мелодии. Именно он должен был добавить красок всей картинке.
Однако, будучи просто выведенной среди кнопок и надписей, обложка выглядела бумажным стикером, наклеенным на экран. Я понял, что без обработки изображения здесь не обойтись.
Некоторые раздумья насчёт того, что можно было бы тут придумать увенчались решением сделать для изображения обложки эффект отражения и тени. Сразу оговорюсь, что практическая реализация отражения не является моей оригинальной идеей. Её я подсмотрел в найденной англоязычной статье. В настоящем посте я лишь хочу привести некоторое осмысление производимых над изображением манипуляций, свои дополнения к процессу обработки и отметить некоторые нюансы работы с Bitmap в Android.
Итак, на входе я имел Bitmap с картинкой. Для начала я создал пустой Bitmap размером с оригинальную картинку, который позже должен был стать той же обложкой, но с нанесённой на неё тенью.
Этот метод создаёт изменяемый (что важно) Bitmap.
Здесь обязательно нужно отметить, что при работе с Bitmap’ами необходимо внимательно следить за памятью. Придётся ловить исключения. И ещё один момент: изучение профайлером показало, что перед вызовом метода createBitmap() работает сборщик мусора. Учтите это, если в вашем приложении скорость работы критична.
Далее я создал холст и нанёс на него исходное изображение.
В этом месте отмечу, что всегда, как только Bitmap становится не нужен, его нужно уничтожать методом recycle(). Дело в том, что объект этого типа представляет собой всего лишь ссылку на память с самим изображением и выглядит для сборщика мусора очень маленьким (хотя на самом деле памяти занято много). Это может привести к тому, что память закончится в самый неподходящий момент.
После всей подготовки я нанёс на холст краску с тенью.
RadialGradient в моём случае представляет тень, падающую по полукругу из правого верхнего угла изображения в центр нижней грани. Ему нужно установить центр (может выходить за пределы картинки), радиус, последовательность цветов и расстояния от центра по радиусу для каждого цвета. Для тени использовалось изменение альфы в цветах на радиусе.
LinearGradient использовался для фэйда краёв картинки. Его применение очень похоже на RadialGradient. Нужно задать начало и конец линии, вдоль которой пойдёт градиент, цвета и их позиции на этой линии.
Наконец, я приступил к рисованию отражения. К этому моменту у меня уже был Bitmap с нанесёнными тенями gradBitmap. Опять надо было создавать холст, создавать пустое изображение (на этот раз на треть длиннее оригинального), помещать его на холст и наносить на верх него Bitmap с тенями.
После недолгих приготовлений начиналось самое интересное. Я создал матрицу, переворачивающую изображение снизу вверх. С её помощью создал Bitmap из трети исходного и нанёс его на холст под оригинальным изображением.
Кстати, краткое замечание: в классе Bitmap существует несколько методов createBitmap, и лишь один из них создаёт изменяемые Bitmap’ы, на которых можно рисовать. Остальные для рисования НА них не годятся.
И наконец, нанесение прозрачного градиента для придания эффекта отражения.
Краска наносится на ту часть рисунка, которая является отражением.
Всё. Я получил refCover — Bitmap, на котором изображена обложка альбома с тенью, сглаженными краями и отражением.
P.S. В данной статье для меня был важен не сам факт достижения визуальных эффектов, а способы их получения и нюансы, с ними связанные. Если для кого-то вещи, описанные здесь, очевидны — прекрасно. Всем остальным, я надеюсь, статья поможет в написании своих приложений под Android.
UPD: картинки ДО и ПОСЛЕ
Формат bmp что это такое? Где используется и как с ним работать
Формат bmp что это такое? В этой статье мы разберем ответ на этот вопрос. Также выясним, где используется данный формат и как с ним работать.
Формат bmp что это такое, описание формата
Здравствуйте, друзья! Во время продвижения ресурсов в Интернете, пользователи используют картинки с разными форматами. Это могут быть Jpeg, Png, Gif и другие форматы файлов, которые являются популярными, и часто используемыми.
Но иногда приходится применять на практике другой формат картинок, который называется bmp. Он не на столько популярен среди пользователей Интернета, как предыдущие форматы изображений. В статье мы восполним пробел и рассмотрим вопрос, формат bmp что это такое? Разберем суть работы с этим форматом.
Итак, bmp – это старый формат картинок, с помощью которого сохраняются только растровые изображения, а векторные нет. С английского языка слово переводится, как «Bitmap Picture» или BMP, что значит формат для хранения растровых изображений. Данный формат для файлов разработала компания Майкрософт (Скрин 1).
Также он включает в себя ряд других расширений формата, например, bmp, dib и.rle. Этот формат картинок до сих пор работает со многими программами, в том числе он используется в операционных системах Windows и macOS.
Далее, мы рассмотрим процесс открытия этого формата различными программами. Также поработаем с ним на практике и попробуем его конвертировать в другие растровые форматы.
Чем открыть bmp формат
Формат bmp можно открыть в Windows стандартными программами и утилитами:
Конечно, это не все программы, которые способны открывать bmp файлы. Например, на блоге писали о программе XnView, которая выполняет работу по конвертации файлов и их открывает. В Интернете есть много других похожих утилит.
Как открыть bmp формат
Думаю понятен ответ на вопрос, формат bmp что это такое.
Далее, рассмотрим на практике, как открывается этот формат картинок на компьютере с использованием двух программ:
Если у вас установлена программа Фотошоп на компьютере, нажимаете по bmp картинке правой кнопкой мыши, далее выбираете из меню «Открыть с помощью» и например, «Adobe Photoshop cs6» (Скрин 2).
После этого картинка в bmp формате будет открыта в данной программе (Скрин 3).
Открывать такой формат с помощью программы Пеинт еще проще. Для этого нажимаем по картинке правой кнопкой мыши и выбираем кнопку из меню «Просмотр», либо кнопку «Изменить» (Скрин 4).
Далее картинка в bmp формате, будет открыта к просмотру на компьютере.
Как преобразовать bmp формат в другие форматы
Иногда возникает необходимость преобразовать бмп-формат в популярные форматы. В этом случае используются специальные сервисы-конвертеры:
Есть и другие конвертеры в Интернете, которыми вы можете воспользоваться бесплатно.
Итак, чтобы преобразовать в них bmp формат, загружаете туда картинку в данном формате. Далее выбираете на сервисе нужный формат для конвертации. После чего нажимаете кнопку «Начать конвертирование» или «Конвертация».
Когда он преобразуется в другой файл формата, его можно будет скачать на компьютер, например, картинку в формате Jpeg.
Размер формата bmp
Размеры формата bmp могут быть разными, в зависимости от качества изображения картинок. К примеру, если картинка в формате bmp будет иметь разрешение 1380 на 820 пикселей, то ее размер может быть объемным, например, 250 мегабайт.
С низким качеством изображения и размером, например, 300 на 200 пикселей, bmp картинки будут весить 1-5 мегабайт.
Из этого следует сделать вывод, что картинки в формате bmp, как правило, считаются тяжелыми и много весят.
Где используется данный формат
Несмотря на то, что пользователи считают БМП формат устаревшим форматом, его используют во многих сферах деятельности.
Например, старые интерфейсы Windows и новые были созданы на основе этого формата. Почему именно он? Потому что его удобно использовать при создании картинок, которые не теряют качества после их изменений.
Также он может использоваться в Фотошопе, при редактировании картинки. Люди загружают подобные изображения в социальные сети, на свои сайты в Интернете.
Компания Майкрософт создала данный формат, который использует его во время разработок своих продуктов.
Заключение
В статье мы ответили на вопрос, формат bmp что это такое? Рассмотрели специальные программы, с помощью которых можно открывать и просматривать bmp картинки и не только.
Конечно, лучше использовать современные форматы картинок, поскольку они многослойные и способны без технических проблем загрузится на любой сайт в Интернете и не только. Вместе с тем, они имеют много возможностей для редактирования изображений, у них небольшой объем файла.
jenyay.net
Софт, исходники и фото
Описание формата BMP
Эта статья про то, как выглядит графический формат bmp. Хоть это и один из простых форматов, но из-за того, что существует много вариаций этого формата, то не все моменты очевидны. Итак, хватит лить воду, начнем.
Структуры формата
Для начала приведем графическое представление данных в bmp (картинка взята из MSDN).
В начале стоит заголовок файла (BITMAPFILEHEADER). Он описан следующим образом:
Здесь и далее будем считать, что переменная bfh объявлена как BITMAPFILEHEADER bfh;
А дальше идет структура BITMAPINFOHEADER, которая объявлена так:
Виды формата BMP
Хранение данных в формате bmp
Сразу за палитрой идет сам растр. Тут уже более запутано. Во-первых, пиксели тут описываются так, как написано в таблице выше в зависимости от формата. И могут сами содержать значение компонентов цвета (для беспалитровых), а могут быть индексами массива-палитры. Сама картинка записывается построчно. Во-вторых, картинка идет как бы перевернутая вверх ногами. То есть сначала записана нижняя строка, потом предпоследняя и так далее до самого верха. И, в-третьих, как написано в [1], если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми) байтами, чтобы длина строки оказалась кратна параграфу. Вот это и есть самое неприятное. Дело в том, что для каждого формата приходится подстраивать это число пустых байтов (правда, я люблю туда записывать часть палитры, просто мне не хочется заводить лишние «нулевые» переменные, если все-равно эти байты пропускают и никому они не нужны). Я привожу таблицу с формулами, которые показывают для какого формата сколько байт надо дописывать в конец строки. Там под переменной Width, как можно догадаться, подразумевается ширина картинки. Все эти формулы были установлены экспериментально. Я приведу пример только для наиболее используемых форматов. Для остальных вы можете написать сами.
biBitCount | Формула на С |
8 | (3 * Width) % 4 |
16 | (2 * Width) % 4 |
24 | Width % 4 |
Примеры программ
Все исходники вы можете скачать отсюда.Я особо не буду тут много писать. Просто приведу функции с комментариями.
Привет 1. Создание картинки в формате bmp.
Здесь создается однотонная картинка. В примерах таких функций три: создание bmp 8, 16 и 24 бит. Я приведу только для 16-битных.
// Создадим картинку в формате bmp 16 бит типа 5-5-5, которая будет просто однотонной
void CreateBmp555 ( char * fname, WORD color )
<
HANDLE hFile ;
DWORD RW ;
int i, j ;
// Объявим нужные структуры
BITMAPFILEHEADER bfh ;
BITMAPINFOHEADER bih ;
BYTE Palette [ 1024 ] ; // Палитра
// Пусть у нас будет картинка размером 35 x 50 пикселей
int Width = 35 ;
int Height = 50 ;
Пример 2. Преобразование картинки из формата 8 бит (256 цветов) в 24 бит.
BOOL Convert256To24 ( char * fin, char * fout )
<
BITMAPFILEHEADER bfh ;
BITMAPINFOHEADER bih ;
int Width, Height ;
RGBQUAD Palette [ 256 ] ;
BYTE * inBuf ;
RGBTRIPLE * outBuf ;
HANDLE hIn, hOut ;
DWORD RW ;
DWORD OffBits ;
int i, j ;
// Выделим память
inBuf = new BYTE [ Width ] ;
outBuf = new RGBTRIPLE [ Width ] ;
// Заполним заголовки
bfh. bfOffBits = sizeof ( bfh ) + sizeof ( bih ) ; // Не будем писать палитру
bih. biBitCount = 24 ;
bfh. bfSize = bfh. bfOffBits + 4 * Width * Height + Height * ( Width % 4 ) ; // Размер файла
delete inBuf ;
delete outBuf ;
CloseHandle ( hIn ) ;
CloseHandle ( hOut ) ;
return TRUE ;
>
В функцию надо передавать имена исходного и конечного файла соответственно.
Источники
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
Формат и чтение BMP файла (BMP format)
Создайте в графическом редакторе PAINT растровое изображение размером 50*35 пикселов. Выберите максимальный масштаб изображения и включите сетку. Сохраните рисунок в формате BMP как монохромный (файл 50_35.bmp).
Откройте листинг файла 50_35.bmp в приложении Commander (TC, VC или WC) для просмотра (клавиша F3) в шестнадцатеричном (HEX) представлении.
Сопоставим картинку растрового изображения и HEX коды в листинге файла 50_35.bmp.
Коды с 19-го по 23-й (32 00 00 00) определяют размер растра (число пикселов) по горизонтали. Коды с 24-го по 27-й (23 00 00 00) определяют размер растра по вертикали. Чтобы убедиться в этом воспользуйтесь калькулятором. В рассматриваемом примере размер растра – 50 * 35. HEX коду 32 соответствует десятичное (DEC) число 50, HEX коду 23 – DEC число 35.
На размера растра отводится 4 байта (HEX кода). Одним байтом определяется размер от 0 до 255. При превышении 255 (код FF) будет задействован следующий байт. Например, DEC числу 256 соответствует HEX код 100. Размер растра 256 будет представлен в листинге файла (00 01 00 00).
Коды символов, начиная с 63-го и до конца файла, содержат последовательность данных о цвете точек растра – в порядке слева направо вдоль каждой ряда и снизу вверх по рядам. Один байт описывает 8 точек, белая точка в BIN коде описывается единицей, черная – нулем.
Сколько байт необходимо для описания 50 точек в одном ряду? Не менее 7 (7*8=56). Но используется 8 (8*8=64), соблюдается кратность 4 байтам (4*8=32). Обратите внимание в листинге файла на HEX коды в конце описания каждого ряда повторяются байты FF FF C0 00. Эти байты описывают последние 32 точки из 64-х. Из них 14 несуществующих точек (64-50=14) описаны нулями.
Точки какого ряда описаны кодом FC 1F? Отсчитываем ряды по (по 8 байт в каждом), можно также ориентироваться на код (C0 00) в конце каждого ряда. Получаем 11-й ряд. В нем находятся 5 точек. Проверяем результат с помощью калькулятора.
VLISP программа считывания данных из BMP-файла (монохромного)
Программа последовательно считывает из BMP-файла HEX-коды. По этим данным определяется порядковый номер каждой черной точки в ряду, начиная слева. Порядковые номера черных точек каждого ряда заносятся в список, который после окончании чтения ряда записывается в файл Result.txt.
Информация, записанная в файл Result.txt:
Описание программы
Из BMP-файла последовательно считываются байты с помощью функции read-char. Данные, которые будут использоваться в программе, запоминаются в переменных, остальные пропускаются.
Размер растра (xsize и ysize) определяется парой из 4-х байт. Как объединить эти 4 байта в одно число? Рассмотрим более простую задачу. Как из 4-х цифр «5» «8» «9» и «1» сформировать число 1985? Для этого каждую цифру сдвигаем влево на соответствующее количество разрядов (добавляем нули слева), а результат суммируем.
Аналогично решается задача формирования 4-х байтного числа. В пользовательской функции (r) из 4-х байтов сложением формируется одно число. Каждый байт перед сложением сдвигается на соответствующее количество разрядов (1, 2 и 3 байта). Сдвиг выполняется функцией Lsh, параметры сдвига указывается в битах (8, 16 и 24). Функция (r) возвращает число в 10-тичном представлении. Результат запоминается в переменных (xsize и ysize).
Далее считываются и обрабатываются точки, на предмет выявления их цвета. Используется внешний цикл по ysize и внутренний цикл по xsize.
Учитывая, что число байтов, которые описывают один ряд точек, кратно 4 объединим их по аналогии с предыдущей задачей. Только в этом случае из 4-х цифр «5» «8» «9» и «1» будем формировать число 5891:
Эту задачу в программе решает пользовательская функция (r). Она объединяет 4-х байта в 32 разрядное число, которое сохраняется в переменной n. В функции (r) также создается 32 разрядное число (сохраняется в переменной mask), первый бит которого – 1(единица), остальные – 0 (ноль). Начальное значение «маски» формируется путем побитового сдвига единицы влево на 31 разряд (lsh 1 31):
Отметим, что любое число независимо от его представления (HEX, DEC, BIN) остается одним и тем же. А функции обрабатывают его по-разному. Например, функция read-char работает с байтами, а Lsh с битами.
Тестирование каждой точки, которая описывается в переменной n, анализируется путем применения побитового умножения c значением переменной mask(if (= (logand n mask) 0) (setq lst (cons x lst))):
В верхнем примере проверялась крайняя 6-я точка сформированного числа, в нижнем примере – 19-я точка. Если результат побитового умножения ноль, то проверяемая точка – черная. Порядковый номер точки в ряду сохраняется в переменой x. Каждая черная точка заносится в начало списка (setq lst (cons x lst)). По окончании анализа ряда список записывается наоборот в файле результата result.txt (princ (reverse lst) fo).
Маска и число обновляются после 32 сдвигов (if (= mask 0) (m)), а также, в случае, если заканчивается внутренний цикл (repeat xsize…). При этом, лишние пиксели, которые находятся за пределами растра (64-50=14), автоматически отсекаются, поскольку в начале очередного цикла по Y (repeat ysize (m) …) значения переменных n и mask обновляются.
Формат BMP (24-bit Bitmap)
На рисунке приведен пример простого изображения (размер 34 *10 точек) из 3-х красных точек в левом нижнем углу, остальные точки белые.
Раскрываем листинг файла и, сопоставляя с изображением, определяем, как описываются данные в нем:
Файл начинается с символов “BM”, указывающих на формат файла.
С 19 позиции 4 байта (22 00 00 00) указывают размер файла по X (количество точек в строке 34), с 23-й позиции – 4 байта (0A 00 00 00) указывают размер файла по Y (количество рядов 10).
Начиная с 55-го байта и до конца файла содержатся данные о цвете точек растра – в порядке слева направо вдоль каждого ряда и снизу вверх по рядам. Одна точка описывается тремя байтами, каждый из которых представляет синюю (Blue), зеленую (Green) и красную (Red) составляющие цвета. В рассматриваемом примере первая точка (красного цвета) описана байтами (00 00 FF) вторая (белого цвета) – (FF FF FF).
Каждый ряд точек описывается количеством байт, кратным 4. Ряд из 34 точек должен описываться 34*3 + 2 =104 байтами. Два байта (00 00) добавляется в конце описания каждого ряда для обеспечения кратности 4. Если бы ряд состоял из 33 точек, то в конце каждого ряда добавилось по 1 байту для обеспечения кратности 4 (33*3 + 1 =100).
Загрузка и чтение BMP (24-bit Bitmap) на VB.NET
Ниже приводится модуль программы, который используется в приложении для идентификации продуктов (фруктов и овощей) на основе данных от видеокамеры. Модуль обеспечивает загрузку картинки и считывания точек (по 3 байта на каждую точку) из файла.
С++ программа считывания данных из BMP (24-bit Bitmap)
Ниже приводится модуль программы, который используется в приложении 3D-реконструкция по 2-м изображениям. Модуль обеспечивает загрузку данных из BMP файлов в динамически выделяемую оперативную память.
Формат Bmp (256-цветной)
За информационным заголовком следует таблица цветов, представляющая собой массив из 256 (по числу цветов) 4-байтовых полей. Каждое поле соответствует своему цвету в палитре, а три байта из четырех – компонентам синей, зеленой и красной составляющих для этого цвета. Последний, самый старший байт каждого поля зарезервирован и равен 0.
После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки – слева направо. Так как на некоторых платформах невозможно считать единицу данных, которая меньше 4 байт, длина каждой строки выровнена на границу в 4 байта, т. е. при длине строки, некратной четырем, она дополняется нулями. Это обстоятельство обязательно надо учитывать при считывании файла.
На нижнем рисунке представлено точечное изображение (10*5) и конец листинга файла, где захвачены несколько полей из таблицы цветов и приводятся данные об изображении (обведены красной линией).
На рисунке выделены по 4 байта цветов палитры, которые используются для указания цвета точек. Белый цвет имеет последний номер в таблице цветов – 255 (FF). Синий цвет указан под номером 252 (FC), зеленый – 250 (FA), красный – 249 (F9). Длина каждой строки дополняется 2-я байтами (00 00) для кратности 4 (10+2=12).