- Сообщения
- 33 769
- Реакции
- 11 042
Все они состоят из пустоты и движения электроноввсе они бинарные.
Бинарные или текстовые - это классификация способов открытия их на чтение/запись
Все они состоят из пустоты и движения электроноввсе они бинарные.
Это и есть софистика, ибо представление информации в виде нулей и единиц - антропоморфизм, причем очень молодойибо хранятся в виде последовательности единиц и нулей
О как.рассматривается значение слова "бинарный" (binary) как способ открытия файла бейсиковской командой Open
На кореле проверю завтра, но вообще все должно работать. Только определения переставить, и переменную объявить "Dim strVarPath As String"VBA 7.1 все это не работает (((((
Type BGR '3 байта / 1 вариант
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
End Type 'Обратите внимание, что поля всегда имеют синий цвет -> зеленый -> красный
Type BITMAPFILEHEADER '14 байт
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End Type
Type BITMAPINFOHEADER '40 байт
biSize As Long
biWidth As Long
biHeight As Long
iplanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Type BITMAPFILE
bmfh As BITMAPFILEHEADER
bmih As BITMAPINFOHEADER
aBitmapBits() As BGR 'Содержат 3-байтовые элементы
End Type
На самом деле на "Private type"Возможно вылечится сменой "type" на "public type".
Private Type BITMAPFILEHEADER '14 байт
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End Type
Private Type BITMAPINFOHEADER '40 байт
biSize As Long
biWidth As Long
biHeight As Long
iplanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type BGR '3 байта / 1 вариант
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
End Type 'Обратите внимание, что поля всегда имеют синий цвет -> зеленый -> красный
Private Type BITMAPFILE
bmfh As BITMAPFILEHEADER
bmih As BITMAPINFOHEADER
aBitmapBits() As BGR 'Содержат 3-байтовые элементы
End Type
Dim bitmap1 As BITMAPFILE
Dim headers As Integer
Dim hei, wid, kx, ky As Long
Sub Init()
Open strVarPath For Binary As #1
End Sub
Sub Read_header()
Get #1, , bitmap1.bmfh
Get #1, , bitmap1.bmih
headers = LOF(1) - bitmap1.bmih.biSizeImage 'Размер части от начала до данных
End Sub
Sub Next_init()
Dim i, j As Long
Dim bitmp As String
hei = bitmap1.bmih.biHeight
wid = bitmap1.bmih.biWidth
'--------------- Получить высоту и ширину
kx = wid
ky = hei
'--------------- Сделать ширину ровной
If (kx Mod 2 <> 0) Then
kx = kx + 1
End If
'--------------- объявить массив, из которых размер = высота х ширина
ReDim bitmap1.aBitmapBits(ky, kx)
Close #1
Init
bitmp = Space(headers)
Get #1, , bitmp '------ Прочитайте часть перед данными
For i = 1 To ky
For j = 1 To kx
Get #1, , bitmap1.aBitmapBits(i, j) 'Здесь мы читаем данные пострчно
Next j
Next i
End Sub
Sub process()
'Здесь выполняются задачи на основе полученного массива данных
End Sub
Sub Finish()
Close #1
End Sub
Private Sub cmdWork_Click()
Init
Read_header
Next_init
process
Finish
End Sub
Если помещать код в Global Macros - Modules, то и обычный type проходит без вопросов.На самом деле на "Private type"
Вот такой код у меня скомпилировался без проблем во всяком случае
Private Type BITMAPFILEHEADER '14 bytes
bfType As Integer
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End Type
Private Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
iplanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type BGR '3 bytes / 1 variant
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
End Type 'Always B - G - R
Private Type BITMAPFILE
bmfh As BITMAPFILEHEADER
bmih As BITMAPINFOHEADER
aBitmapBits() As BGR '3xByte
End Type
Dim bitmap1 As BITMAPFILE
Dim headers As Integer
Dim hei, wid, kx, ky As Long
Sub Init()
Open DesktopPath + "ATest.bmp" For Binary As #1
End Sub
Sub Read_header()
Get #1, , bitmap1.bmfh
Get #1, , bitmap1.bmih
headers = LOF(1) - bitmap1.bmih.biSizeImage 'Part before data
End Sub
Sub Next_init()
Dim i, j As Long
Dim bitmp As String
hei = bitmap1.bmih.biHeight
wid = bitmap1.bmih.biWidth
'--------------- Width and Height
kx = wid
ky = hei
'--------------- Straighten
If (kx Mod 2 <> 0) Then
kx = kx + 1
End If
'--------------- Array of pixels
ReDim bitmap1.aBitmapBits(ky, kx)
Close #1
Init
bitmp = Space(headers)
Get #1, , bitmp '------ Read in header
For i = 1 To ky
For j = 1 To kx
Get #1, , bitmap1.aBitmapBits(i, j) 'Read in data
Next j
Next i
End Sub
Sub process()
ActiveDocument.Unit = cdrMillimeter
Dim i, j As Long
Dim S As Shape, SR As New ShapeRange
For i = 1 To ky
For j = 1 To kx
Set S = ActiveVirtualLayer.CreateEllipse2(j, i, 0.5)
S.Fill.ApplyUniformFill CreateRGBColor(bitmap1.aBitmapBits(i, j).rgbRed, bitmap1.aBitmapBits(i, j).rgbGreen, bitmap1.aBitmapBits(i, j).rgbBlue)
S.Outline.SetNoOutline
SR.Add S
Next j
Next i
ActiveDocument.LogCreateShapeRange SR
End Sub
Sub Finish()
Close #1
End Sub
Private Sub cmdWork_Click()
boostStart "BitmapRead"
Init
Read_header
Next_init
process
Finish
boostFinish True
End Sub
Public Function DesktopPath() As String
DesktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
End Function
Вы не учитываете выравнивание на двойное слово?Кто-то сталкивался с таким, как обойти?
Если я правильно понял в таком случае 53х72 пикселя должны бы быть ровными и только 70x96 кривыми. Тут вроде что-то другое...Вы не учитываете выравнивание на двойное слово?
Без понятияЕсли я правильно понял в таком случае 53х72 пикселя должны бы быть ровными и только 70x96 кривыми. Тут вроде что-то другое...
Никто от вас ничего не требует - если вы сами поставили себя в роли какого-то мессии то в этом никто другой не виноват. Не хотите, не отвечайте.Без понятия
Я повторяю - вы упорно требуете от меня рыбу, когда я буквально в лицо настойчиво вам тыкаю удочку
От которой вы еще и отбиваетесь, говоря что дырявыми трусами поймаете больше и жирнее
У вас в алгоритме НЕ УЧИТЫВАЕТСЯ выравнивание строки BMP на слово
Курите спецификацию BMP
Странно слышать такое от программиста с десятилетним стажемСо спецификацией BMP я не знаком, по этому и вопрос. Одна строчка "Вы не учитываете выравнивание на двойное слово?" не особенно помогает.
Сразу за палитрой идет сам растр. Тут уже более запутано. Во-первых, пиксели тут описываются так, как написано в таблице выше в зависимости от формата. И могут сами содержать значение компонентов цвета (для беспалитровых), а могут быть индексами массива-палитры. Сама картинка записывается построчно. Во-вторых, картинка идет как бы перевернутая вверх ногами. То есть сначала записана нижняя строка, потом предпоследняя и так далее до самого верха. И, в-третьих, как написано в [1], если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми) байтами, чтобы длина строки оказалась кратна параграфу.