Программа Microsoft Excel обладает удивительными возможностями по обработке данных, автоматизации учета, решении разнообразных прикладных задач. Excel можно даже использовать для создания пиксельных графических изображений, что очень удобно для разработки шрифтов и графики встраиваемых устройств.
[Создание пиксельных изображений]
При моделировании интерфейса пользователя различных устройств на микроконтроллерах важно иметь удобный инструмент для удобного редактирования однобитной графики. В этой статье будет показано, как использовать для этой цели инструментарий Excel.
1. Подготовка листа для рисования точек. По умолчанию лист Excel имеет вытянутые по горизонтали ячейки.
Прямоугольные ячейки хороши для ввода текста и формул, но для графики они неудобны. Нужно поменять размер ячеек так, чтобы они стали квадратными - тогда каждая ячейка будет соответствовать одной точке графического индикатора разрабатываемого устройства. Предположим, что Ваш графический индикатор LCD имеет размер экрана 240 по горизонтали на 128 точек по вертикали (индикатор WG240128A).
Выделите все ячейки листа целиком (для этого нужно щелкнуть мышью в левом верхнем углу рабочего пространства, где начинаются заголовки строк и столбцов). Затем в меню Формат -> Строка -> Высота установите высоту 9, и в меню Формат -> Столбец -> Ширина установите ширину 1. Получится лист с мелкими квадратными ячейками.
2. Рисование графики. Теперь в области 240x128 ячеек можно с помощью инструмента Fill (Цвет заливки) рисовать по точкам графические изображения для организации GUI.
Для упрощения работы можно записать макросы для заполнения выделенной области нужным цветом, и для очистки области. Макросы записываются через меню Сервис -> Макрос -> Начать запись... Привяжите к записываемому макросу удобную горячую комбинацию клавиш.
Просмотреть текст записанных макросов и отредактировать их можно через меню Сервис -> Макрос -> Макросы... -> Изменить.
3. Экспортирование графики файл BMP. Для этой цели можно воспользоваться мощным инструментом - встроенным в Office языком программирования VBasic (VBA, Visual Basic for Applications). В интернете я нашел готовый скрипт для сохранения области листа Excel в растровый файл BMP без сжатия в формате RGB (24 бита на точку). Это на мой взгляд самый удобный и универсальный формат для представления графики встраиваемой микроконтроллерной техники. Его потом можно легко преобразовать и в монохромный формат. Скрипт я немного переделал так, чтобы он сохранял в файл выделенную область, и чтобы BMP-файлу автоматически давалось имя на основе текущей даты и времени.
Attribute VB_Name ="Module1"Option Explicit
Option Base 1Private Type typHEADER
strType AsString*2' Сигнатура BMP-формата = "BM"
lngSize AsLong' Размер файла
intRes1 AsInteger' зарезервировано = 0
intRes2 AsInteger' зарезервировано = 0
lngOffset AsLong' смещение до данных растра (биты картинки)End Type
Private Type typINFOHEADER
lngSize AsLong' Размер
lngWidth AsLong' Высота
lngHeight AsLong' Длина
intPlanes AsInteger' Количество слоев в файле
intBits AsInteger' Количество бит на пиксел (у нас RGB 24 бита)
lngCompression AsLong' Тип компрессии (установлено в 0)
lngImageSize AsLong' Размер картинки (в байтах, установлено в 0)
lngxResolution AsLong' Разрешение устройства по X (установлено в 0)
lngyResolution AsLong' Разрешение устройства по Y (установлено в 0)
lngColorCount AsLong' Количество цветов (для 24 установлено в 0)
lngImportantColors AsLong' "Важные" цвета (установлено в 0)End Type
Private Type typPIXEL
bytB AsByte' Blue, канал синего
bytG AsByte' Green, канал зеленого
bytR AsByte' Red, канал красногоEnd Type
Private Type typBITMAPFILE
bmfh As typHEADER
bmfi As typINFOHEADER
bmbits() AsByteEnd Type
'' Генерирование имени файла из даты и времени.''FunctionFileName() AsStringDim currentTimeDate AsVariantDim iYear, iMonth, iDay AsIntegerDim iHour, iMinute, iSec AsInteger
currentTimeDate = Now()
iYear = Year(currentTimeDate)
iMonth = Month(currentTimeDate)
iDay = Day(currentTimeDate)
iHour = Hour(currentTimeDate)
iMinute = Minute(currentTimeDate)
iSec = Second(currentTimeDate)
FileName = Format(currentTimeDate, "yymmdd") _
+ Format(currentTimeDate, "hhmmss") +".bmp"EndFunction'' Этот макрос на входе получает диапазон ячеек листа' Excel и создает по ним картинку - файл BMP по цветам' ячеек. Формат файла BMP 24 бита, несжатый.'SubsubCellsToBMP(rngPicture As Range)
Dim i AsLong, j AsLong, k AsLong, l AsLong'Dim bmpFile As typBITMAPFILE
Dim lngRowSize AsLongDim lngPixelArraySize AsLongDim lngFileSize AsLong'Dim bytRed AsInteger, bytGreen AsInteger, bytBlue AsIntegerDim lngRGBColor() AsLong'Dim strBMP AsString'' Сначала проверим на допустимый размер картинки - есть некоторые' разумные ограничения'If (rngPicture IsNothing) ThenExitSubIf (rngPicture.Cells.Count <4) Then
MsgBox "Tried to export a BMP with less than 4 pixels!", _
vbOKOnly + vbCritical, "BMP Export Error"ExitSubEndIf'' Создание данных BMP, основываясь на выбранных ячейках.'With bmpFile
' BMP HeaderWith .bmfh
.strType ="BM"' Базовый тип файла BMP
.lngSize =0' Определим позже (размер в байтах)
.intRes1 =0' Установлено в 0
.intRes2 =0' Установлено в 0
.lngOffset =54' Место, откуда начинается растр bitmapEndWith' DIB HeaderWith .bmfi
.lngSize =40' Это версия Version 3 BMP' Количество пикселей по ширине:
.lngWidth = rngPicture.Columns.Count
' Количество пикселей по высоте:
.lngHeight = rngPicture.Rows.Count
.intPlanes =1' 1 слой
.intBits =24' 24 бита на точку (RGB)
.lngCompression =0' Без сжатия
.lngImageSize =0' Может быть установлено в 0
.lngxResolution =0' Установлено в 0
.lngyResolution =0' Установлено в 0
.lngColorCount =0' Установлено в 0 (нет цветовой палитры)
.lngImportantColors =0' Установлено в 0EndWith' Размер 32-битного массива растра в байтах (нужно обеспечить' выравнивание массива по 32 битной границе!).'Здесь была ошибка, на самом деле нужно использовать округление сверху:'lngRowSize = Round(.bmfi.intBits * .bmfi.lngWidth / 32) * 4'Начиная с версии Excel 2010 для выравнивания можно использовать это:'lngRowSize = WorksheetFunction.Ceiling_Precise _' ((.bmfi.intBits * .bmfi.lngWidth / 32) * 4)'В версии Excel 2003 надо так:Dim rounded, unrounded AsDouble
unrounded = .bmfi.intBits * .bmfi.lngWidth /32
rounded = Round(.bmfi.intBits * .bmfi.lngWidth /32)
If rounded < unrounded Then
lngRowSize = (rounded +1) *4Else
lngRowSize = rounded *4EndIf
lngPixelArraySize = lngRowSize * .bmfi.lngHeight
' Общее количество байт для сохранения выровненного массива пикселейReDim .bmbits(lngPixelArraySize)
'' Чтение данных цвета из ячеек (если цвета нет, то считается что' это белый). Сканирование начинается снизу и продолжается вверх.' Необходимо выравнивание каждой строки по границе 4 байта.' ПРИМЕЧАНИЕ: вместо чтения цветов Вы можете читать числа,' и получать значение "bytBlue", "bytGreen", "bytRed" напрямую' из этих чисел.'
k =0ReDim lngRGBColor(rngPicture.Rows.Count, rngPicture.Columns.Count)
' Цикл по строкам:For j = rngPicture.Rows.Count To1Step-1' Цикл по столбцам:For i =1To rngPicture.Columns.Count
If (LongToRGB(rngPicture.Cells(j, i).Interior.Color, _
bytRed, bytGreen, bytBlue)) Then
k = k +1
.bmbits(k) = bytBlue
k = k +1
.bmbits(k) = bytGreen
k = k +1
.bmbits(k) = bytRed
Else
k = k +1
.bmbits(k) =255
k = k +1
.bmbits(k) =255
k = k +1
.bmbits(k) =255EndIfNext i ' Для каждого столбца...If (rngPicture.Columns.Count * .bmfi.intBits /8< lngRowSize) Then' Добавим выравнивание, если это необходимоFor l = rngPicture.Columns.Count * .bmfi.intBits /8+1To lngRowSize
k = k +1
.bmbits(k) =0Next l
EndIfNext j ' Цикл по строкам, начиная снизу...'' Все структуры загружены. Вычисляется размер файла и' в него сохраняются данные растра.'
.bmfh.lngSize =14+40+ lngPixelArraySize
'EndWith' Определение bmpFile''Присвоим имя файлу и полный путь
strBMP = ThisWorkbook.Path &"\"& FileName()
'
Open strBMP For Binary Access Write As1 Len =1'
Put 1, 1, bmpFile.bmfh
Put 1, , bmpFile.bmfi
Put 1, , bmpFile.bmbits
'
Close
'EndSub'' Преобразование числа long integer, представляющего цвет,' в значения каналов red, green, blue.'PublicFunctionLongToRGB(theColor AsLong, _
iRed AsInteger, _
iGreen AsInteger, _
iBlue AsInteger) AsBoolean'
iRed = theColor Mod256'канал R
iGreen = (theColor \256) Mod256'канал G
iBlue = (theColor \256\256) Mod256'канал B'
LongToRGB =TrueEndFunction'' Эта подпрограмма тестирует макрос subCellsToBMP.' Выделенный диапазон ячеек будет сохранен в файл' как картинка BMP.'Sub Преобразовать_в_картинку()
Attribute Преобразовать_в_картинку.VB_Description ="Макрос записан 04.12.2014"
Attribute Преобразовать_в_картинку.VB_ProcData.VB_Invoke_Func ="b\n14"'Dim shtBMP As String имя листа, у меня не используется'Dim rngBMP As Range'shtBMP = "BMP Cells"'Set rngBMP = ThisWorkbook.Worksheets(shtBMP).Range("A1:AN11")Call subCellsToBMP(Selection)
EndSub
4. Загрузка картинки из файла BMP.
Этот скрипт позволяет загрузить в ячейки листа Excel несжатую картинку BMP в формате цвета 24 бита на пиксел. Картинка будет вставлена в то место, где выделена текущая ячейка (это будет левый верхний угол загружаемой картинки).