Здравствуйте! Есть картинка расширением bmp. Подскажите, как сделать, чтобы на листе Excel в каждой ячейке каждый пиксел картинки был обозначен RGB-кодом, например вот так: 123, 022, 003. И обратно, чтобы, имея такую матрицу с RGB кодом, можно было создать картинку bmp. Я нашёл в интернете только конверторы, которые заливают ячейки таблицы тем же цветом, что и пикселы картинки. А мне нужно, чтобы в таблице была кодировка. Подскажите код VBA или дайте ссылку по теме.
MrBrown написал: Я нашёл в интернете только конверторы, которые заливают ячейки таблицы тем же цветом, что и пикселы картинки.
После работы конвертора выделите диапазон закрашенных ячеек и запустите макрос
Код
Sub Br()
Dim c As Range, i&
Selection.NumberFormat = "@"
For Each c In Selection
i = c.Interior.Color
c = Format$(i Mod 256, "000\,") & Format$((i Mod 65536) \ 256, "000\,") & Format$(i \ 65536, "000")
Next
End Sub
Казанский, благодарю. Буду пробовать. Однако здесь получаются лишние телодвижения: 1. Конвертирование. 2. Перевод цвета в код. А как сделать это сразу, чтобы макрос анализировал указанную картинку и заполнял таблицу кодом?
Андрей VG, у-у-у, это мне совсем недоступно. Я умею лишь ваять несложные макросы на VBA по выборке, сортировке данных. Но это всё - в Excel. А вот чтобы Excel вычислял инфу из стороннего файла с другим расширением - это у меня впервые.
MrBrown написал: Я нашёл в интернете только конверторы, которые заливают ячейки таблицы тем же цветом, что и пикселы картинки
Это, что ли? https://excelvba.ru/code/Bitmap2Sheet Несложно переделать программу так, чтобы вместо закраски ячейки туда вписывался текст. Сформулируйте ТЗ полностью. Если Вам не нравятся "лишние телодвижения", то, вероятно, речь идет о массовой обработке файлов? Нужно ли заполнять листы тысячами чисел, может быть, лучше создавать текстовые файлы?
Казанский, да, именно этим и пользуюсь. Попробую переделать. Речь не идёт о массовой обработке многих файлов. Только один файл-картинка. Просто, пытаюсь экспериментировать в стеганографии. Но для этого мне и нужны два макроса конвертации туда-сюда (САБЖ). А уж в Excel я попробую воплотить свою идею замены пикселей по ключу шифра. Идея очень интересная (для меня, естественно). p.s. возможно изобретаю велосипед, но в инете пока не нашёл ничего про свой метод замены пикселей.
MrBrown, для стеганографии ИМХО выгружать картинку на лист, тем более в текстовом виде, не нужно. А нужны три процедуры, которые делают следующее: 1. выдает байтовый массив, который представляет картинку; 2. изменяет младшие биты каждого байта, чтобы записать скрытую информацию; 3. записывает байтовый массив в файл формата bmp. С первой задачей справляется этот кусок из кода формы (плюс процедура выбора и загрузки файла CommandButton_SelectPicture_Click)
Код
'Get information (such as height and width) about the picturebox
GetObject Picture1.Picture, Len(PicInfo), PicInfo
'reallocate storage space
BytesPerLine = (PicInfo.bmWidth * 3 + 3) And &HFFFFFFFC
ReDim PicBits(1 To BytesPerLine * PicInfo.bmHeight * 3) As Byte
'Copy the bitmapbits to the array
GetBitmapBits Picture1.Picture, UBound(PicBits), PicBits(1)
Массив PicBits - искомый байтовый массив. Вторая процедура реализует ваш метод стеганографии. Третью процедуру можно реализовать также через контрол Picture1 на форме
Код
SetBitmapBits Picture1.Picture, UBound(PicBits), PicBits(1)
Me.Repaint 'опционально - перерисовать форму, чтобы увидеть изменение картинки
SavePicture Picture1.Picture, "c:\temp\im1.bmp" 'записать в файл
Вообще, работать с файлом bmp необязательно через форму с контролом типа Image. Можно открыть файл как двоичный, проанализировать заголовок, чтобы понять, где начинаются и заканчиваются данные изображения, внести изменения, сохранить двоичный файл. Все средства в VBA для этого есть (см. справку по операторам Open, Get, Put). Возможно, в библиотеке "gdi32", функции из которой использованы в коде, найдутся функции для облегчения работы с граф. файлами - найдите описание этой библиотеки. Успехов!
Казанский, благодарю за информацию. Узнал много нового. Однако, идея шифрования у меня совершенно иная.
Вот почему я хочу "разложить всё по полочкам" в приложении Excel, чтобы понять, как она (идея) будет работать (или НЕ работать).
Вопрос рядом с темой: где ковырнуть (изменить) код, чтобы программа работала с картинками размером более 200х200 пикселей? Не могу найти это ограничение. Спасибо.