Добрый день всем! Заинтересовался определением цвета пикселя в картинке и нашёл тут: http://www.cyberforum.ru/ms-excel/thread1290906.html интересный макрос, который заливает попиксельно картинку в ячейки экселя. Вернее сам макрос был нацелен заливать график. Я чуть-чуть подправил (просто побаловаться ради). В общем сам вопрос. Не пойму как программа работает толком. Не понимаю именно начало, где задаются типы и их свойства (?). Например:
[vba]
Код
Private Type typHeader Tip As String * 2 Tamanho As Long res1 As Integer res2 As Integer Offset As Long End Type
[/vba]
тут задано Tip, я так понимаю (если правильно вообще понимаю), в программе это в дальнейшем определяется как тип картинки (расширение). Как программа вообще понимает, что это за свойство объекта? Или тут:
[vba]
Код
Private Type typInfoHeader Tamanho As Long Largura As Long Altura As Long Planes As Integer Bits As Integer Compression As Long ImageSize As Long xResolution As Long yResolution As Long nColors As Long ImportantColors As Long End Type
[/vba]
Largura и Altura свойства объекта(картинки), соответствующие количеству точек (пикселей) по вертикали и по горизонтали. Это же свойства, которые задал программист. Я не пойму, где происходит объяснение программе, что какое свойство означает. И почему данная программа работает только с bmp форматом... Поясните, пожалуйста, и поправьте меня, где я не прав. Можно на литературку "для чайников" ссылочку... ато вроде читал "кое-что", но видимо голова дырявая, чтот не врубаюсь.
Добрый день всем! Заинтересовался определением цвета пикселя в картинке и нашёл тут: http://www.cyberforum.ru/ms-excel/thread1290906.html интересный макрос, который заливает попиксельно картинку в ячейки экселя. Вернее сам макрос был нацелен заливать график. Я чуть-чуть подправил (просто побаловаться ради). В общем сам вопрос. Не пойму как программа работает толком. Не понимаю именно начало, где задаются типы и их свойства (?). Например:
[vba]
Код
Private Type typHeader Tip As String * 2 Tamanho As Long res1 As Integer res2 As Integer Offset As Long End Type
[/vba]
тут задано Tip, я так понимаю (если правильно вообще понимаю), в программе это в дальнейшем определяется как тип картинки (расширение). Как программа вообще понимает, что это за свойство объекта? Или тут:
[vba]
Код
Private Type typInfoHeader Tamanho As Long Largura As Long Altura As Long Planes As Integer Bits As Integer Compression As Long ImageSize As Long xResolution As Long yResolution As Long nColors As Long ImportantColors As Long End Type
[/vba]
Largura и Altura свойства объекта(картинки), соответствующие количеству точек (пикселей) по вертикали и по горизонтали. Это же свойства, которые задал программист. Я не пойму, где происходит объяснение программе, что какое свойство означает. И почему данная программа работает только с bmp форматом... Поясните, пожалуйста, и поправьте меня, где я не прав. Можно на литературку "для чайников" ссылочку... ато вроде читал "кое-что", но видимо голова дырявая, чтот не врубаюсь.Roman777
почитать про тип можно, например, здесь - кратенько и доступно
В самом начале из BMP-файла в переменные bmpHeader и bmpInfoHeader (заданные типами typHeader и typInfoHeader) считываются т.н. заголовки - это некие структуры, содержащие служебную информацию о формате файла, размере картинки и т.д., чтобы в дальнейшем было удобнее с ней работать. Ведь удобнее и понятнее обратиться к свойству typInfoHeader.Bits, чтобы узнать глубину цвета картинки, чем считывать из файла значения каждого свойства отдельно по определенному смещению.
О структуре заголовков BMP-файлов можно почитать, например, здесь
почитать про тип можно, например, здесь - кратенько и доступно
В самом начале из BMP-файла в переменные bmpHeader и bmpInfoHeader (заданные типами typHeader и typInfoHeader) считываются т.н. заголовки - это некие структуры, содержащие служебную информацию о формате файла, размере картинки и т.д., чтобы в дальнейшем было удобнее с ней работать. Ведь удобнее и понятнее обратиться к свойству typInfoHeader.Bits, чтобы узнать глубину цвета картинки, чем считывать из файла значения каждого свойства отдельно по определенному смещению.
О структуре заголовков BMP-файлов можно почитать, например, здесьKSV
почему данная программа работает только с bmp форматом
потому, что у каждого формата своя структура хранения данных и, соответсвенно, свой алгоритм их обработки (декодирование и т.д.), а в приведенной вами процедуре заложен алгоритм извлечения данных только из формата BMP, поэтому используя этот алгоритм для файла другого формата (не BMP) данные будут неверно интерпретированы, т.к структура хранения (размер блоков, алгоритмы сжатия и т.д.) будет иная.
почему данная программа работает только с bmp форматом
потому, что у каждого формата своя структура хранения данных и, соответсвенно, свой алгоритм их обработки (декодирование и т.д.), а в приведенной вами процедуре заложен алгоритм извлечения данных только из формата BMP, поэтому используя этот алгоритм для файла другого формата (не BMP) данные будут неверно интерпретированы, т.к структура хранения (размер блоков, алгоритмы сжатия и т.д.) будет иная.KSV
В самом начале из BMP-файла в переменные bmpHeader и bmpInfoHeader (заданные типами typHeader и typInfoHeader) считываются т.н. заголовки - это некие структуры, содержащие служебную информацию о формате файла, размере картинки и т.д., чтобы в дальнейшем было удобнее с ней работать. Ведь удобнее и понятнее обратиться к свойству typInfoHeader.Bits, чтобы узнать глубину цвета картинки, чем считывать из файла значения каждого свойства отдельно по определенному смещению.
Интуитивно примерно так и думал. я пока опережу своё осознание той информации что вы скинули и спрошу сразу. Вот это считывание "заголовков" происходит уже на этапе задания типов: [vba]
Код
Private Type.... ...... End Type
[/vba] ? почему-то, тут формат не "BMP" проверяется а "BM". А при попытке изменить на BMP (при этом я так же изменял и Tip as string*2 на *3), условие срабатывало и говорило что не тот формат
[vba]
Код
If bmpHeader.Tip <> "BM" Then MsgBox "Not a bitmap file.", vbCritical, "Error" End End If
[/vba]
Видимо, в свойстве файла всё-таки bmp формат читается всё-таки как "BM"?
В самом начале из BMP-файла в переменные bmpHeader и bmpInfoHeader (заданные типами typHeader и typInfoHeader) считываются т.н. заголовки - это некие структуры, содержащие служебную информацию о формате файла, размере картинки и т.д., чтобы в дальнейшем было удобнее с ней работать. Ведь удобнее и понятнее обратиться к свойству typInfoHeader.Bits, чтобы узнать глубину цвета картинки, чем считывать из файла значения каждого свойства отдельно по определенному смещению.
Интуитивно примерно так и думал. я пока опережу своё осознание той информации что вы скинули и спрошу сразу. Вот это считывание "заголовков" происходит уже на этапе задания типов: [vba]
Код
Private Type.... ...... End Type
[/vba] ? почему-то, тут формат не "BMP" проверяется а "BM". А при попытке изменить на BMP (при этом я так же изменял и Tip as string*2 на *3), условие срабатывало и говорило что не тот формат
[vba]
Код
If bmpHeader.Tip <> "BM" Then MsgBox "Not a bitmap file.", vbCritical, "Error" End End If
[/vba]
Видимо, в свойстве файла всё-таки bmp формат читается всё-таки как "BM"?Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Воскресенье, 02.08.2015, 21:09
KSV, Я правильно понимаю, что когда мы задаём тип и считываем заголовки с таких объектов (картинок, например), тут главное следовать этой структуре заголовков. Ибо первое свойство будет соответствовать первому заголовку, второе свойство - второму заголовку и тд? А где же можно найти информацию о структурах этих заголовков для разных типов файлов? По идее, можно же как-то макросом пройтись и вытащить их наименования хотябы, чтобы увидеть эту структуру?
KSV, Я правильно понимаю, что когда мы задаём тип и считываем заголовки с таких объектов (картинок, например), тут главное следовать этой структуре заголовков. Ибо первое свойство будет соответствовать первому заголовку, второе свойство - второму заголовку и тд? А где же можно найти информацию о структурах этих заголовков для разных типов файлов? По идее, можно же как-то макросом пройтись и вытащить их наименования хотябы, чтобы увидеть эту структуру?Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Воскресенье, 02.08.2015, 21:13
Private Type typHeader Tip As String * 2 ' 4 байта (2 символа UNICODE) Tamanho As Long ' 4 байта res1 As Integer ' 2 байта res2 As Integer ' 2 байта Offset As Long ' 4 байта End Type
[/vba]просто описывает структуру (порядок расположения и размер переменных), затем объявляется переменная bmpHeader, а считывание заголовков происходит уже в эту переменную [vba]
Код
Get #1, 1, bmpHeader
[/vba], при этом из BMP-файла считывается 14 байт, (соответственно размеру структуры typHeader) и каждый считанный байт сразу ложится "на свое место" (например, в bmpHeader.Tip вы увидите символы "BM", а в bmpHeader.Offset - смещение до первого блока данных - массива с информацией о цвете каждого пиксела) и т.д. Почитайте про структуру формата BMP, например в википедии, хотя, лучше найти в инете представление структуры в виде последовательности блоков (визуальное представление более наглядно).
[vba]
Код
Private Type typHeader Tip As String * 2 ' 4 байта (2 символа UNICODE) Tamanho As Long ' 4 байта res1 As Integer ' 2 байта res2 As Integer ' 2 байта Offset As Long ' 4 байта End Type
[/vba]просто описывает структуру (порядок расположения и размер переменных), затем объявляется переменная bmpHeader, а считывание заголовков происходит уже в эту переменную [vba]
Код
Get #1, 1, bmpHeader
[/vba], при этом из BMP-файла считывается 14 байт, (соответственно размеру структуры typHeader) и каждый считанный байт сразу ложится "на свое место" (например, в bmpHeader.Tip вы увидите символы "BM", а в bmpHeader.Offset - смещение до первого блока данных - массива с информацией о цвете каждого пиксела) и т.д. Почитайте про структуру формата BMP, например в википедии, хотя, лучше найти в инете представление структуры в виде последовательности блоков (визуальное представление более наглядно).KSV
первое свойство будет соответствовать первому заголовку, второе свойство - второму заголовку и тд
структура BITMAPFILEHEADER (typHeader) - содержит инфу о самом файле (тип, размер и т.д.), а по типу "BM" уже видно, что это формат BMP, а значит следом за структурой BITMAPFILEHEADER располагаются данные в соответствии со структурой BITMAPINFO (typInfoHeader), и эта структура уже описывает свойства картинки в формате BMP (ширину и высоту в пикселях, глубина цвета в битах и т.д.), а за этой структурой уже информация о цвете каждого пиксела (на ее начало указывает bmpHeader.Offset, а ее размер = ширина картинки * высоту * глубину цвета (в байтах).)
первое свойство будет соответствовать первому заголовку, второе свойство - второму заголовку и тд
структура BITMAPFILEHEADER (typHeader) - содержит инфу о самом файле (тип, размер и т.д.), а по типу "BM" уже видно, что это формат BMP, а значит следом за структурой BITMAPFILEHEADER располагаются данные в соответствии со структурой BITMAPINFO (typInfoHeader), и эта структура уже описывает свойства картинки в формате BMP (ширину и высоту в пикселях, глубина цвета в битах и т.д.), а за этой структурой уже информация о цвете каждого пиксела (на ее начало указывает bmpHeader.Offset, а ее размер = ширина картинки * высоту * глубину цвета (в байтах).)