Страницы: 1
RSS
Перевести картинку на лист excel цветовым кодом. И - обратно.
 
Здравствуйте!
Есть картинка расширением bmp.
Подскажите, как сделать, чтобы на листе Excel в каждой ячейке каждый пиксел картинки был обозначен RGB-кодом, например вот так:
123, 022, 003.
И обратно, чтобы, имея такую матрицу с RGB кодом, можно было создать картинку bmp.
Я нашёл в интернете только конверторы, которые заливают ячейки таблицы тем же цветом, что и пикселы картинки.
А мне нужно, чтобы в таблице была кодировка.
Подскажите код VBA или дайте ссылку по теме.

Спасибо.
Изменено: MrBrown - 25.07.2018 12:59:35
 
Цитата
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
Изменено: Казанский - 25.07.2018 13:14:48 (добавил форматирование чисел)
 
Обратно
Код
Sub rB()
Dim c As Range, i$
  For Each c In Selection
    i = c
    c.Interior.Color = RGB(Mid$(i, 1, 3), Mid$(i, 5, 3), Mid$(i, 9, 3))
  Next
End Sub
 
Казанский, благодарю. Буду пробовать.
Однако здесь получаются лишние телодвижения:
1. Конвертирование.
2. Перевод цвета в код.
А как сделать это сразу, чтобы макрос анализировал указанную картинку и заполнял таблицу кодом?
Изменено: MrBrown - 25.07.2018 13:29:23
 
Доброе время суток.
Цитата
MrBrown написал:
А как сделать это сразу, чтобы макрос анализировал указанную картинку и заполнял таблицу кодом?
Например, изучить библиотеку Windows Image Acquisition и написать свой конвертер туда и обратно.
 
Андрей 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", функции из которой использованы в коде, найдутся функции для облегчения работы с граф. файлами - найдите описание этой библиотеки.
Успехов!

PS пусть будет здесь
Описание формата BMP https://jenyay.net/Programming/Bmp
Сохранение картинки из буфера обмена в BMP https://www.mrexcel.com/forum/excel-questions/260955-how-do-i-save-bitmap-image-clipboard-bmp-file.html
Изменено: Казанский - 26.07.2018 20:57:34
 
Казанский, благодарю за информацию. Узнал много нового.
Однако, идея шифрования у меня совершенно иная.

Вот почему я хочу "разложить всё по полочкам" в приложении Excel, чтобы понять, как она (идея) будет работать (или НЕ работать).

Вопрос рядом с темой: где ковырнуть (изменить) код, чтобы программа работала с картинками размером более 200х200 пикселей?
Не могу найти это ограничение.
Спасибо.
Страницы: 1
Наверх