Как прочитать Bitmap из библы файлов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Как прочитать Bitmap из библы файлов

Сообщение Zoomie » 01.11.2005 (Вт) 18:53

Привет народ!

Вопрос таков: мне надо прочитать битмап из библиотеки файлов, т.е. из одного большого файла, при этом мне не нужно экстрактить этой файл.

Примерный план:
1)Загружаю в переменную бинарник файла
2)А дальше я не знаю! :D

Э... Че делать?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.11.2005 (Вт) 18:57

Что за библиотека файлов? Надо знать ее формат.

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 01.11.2005 (Вт) 18:59

Файлы пишутся по своему алгоритму:

Примерно так: имя файла, размер - это в принципе не важно, дальше пишу чистый бинарник.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.11.2005 (Вт) 19:16

MSDN & API-Guide писал(а):CreateBitmap
The CreateBitmap function creates a bitmap with the specified width, height, and color format (color planes and bits per pixel).

· nWidth
Specifies the bitmap width, in pixels.
· nHeight
Specifies the bitmap height, in pixels.
· cPlanes
Specifies the number of color planes used by the device.
· cBitsPerPel
Specifies the number of bits required to identify the color of a single pixel.
· lpvBits
Points to an array of color data used to set the colors in a rectangle of pixels. Each scan line in the rectangle must be word aligned (scan lines that are not word aligned must be padded with zeros). If this parameter is NULL, the new bitmap is undefined.


С английским как? :)
Если вкратце, в lpvBits надо передать массив данных о цвете каждой строки пикселей в битмапе.
Предполагаю, что можно скормить целый массив bmp-файла (вырезав заголовок).

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 01.11.2005 (Вт) 19:38

С английским ничего!

А вот с битмапами надо работать...
первые 2 байта - заголовок
С 19 го 4 байта размер по ширине
С 23 го 4 байта размер по высоте

Вот что за байты между 2ым 19ым байтами?

Planes: Число цветовых плоскостей в каpте бит.
BitCount: Число бит цвета на элемент отобpажения дисплея.

Как узнать Planes и BitCount?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.11.2005 (Вт) 19:57

Лезем на www.wotsit.org и смотрим формат bmp-файла. Если что непонятно, спрашиваем тут. Будем направлять.

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 01.11.2005 (Вт) 20:01

Да вот только что нашел сам! :D

Пока все понятно!

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 01.11.2005 (Вт) 20:19

А зачем знать формат .BMP файла?
Amed - Вам точно указал как надо делать.
Всё относительно и всё есть - логический хаос.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.11.2005 (Вт) 21:14

Надо же знать размер заголовка.

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 01.11.2005 (Вт) 21:36

Amed писал(а):Надо же знать размер заголовка.


Amed, правильно говоришь! Уже почти познал эти тайны!

Но есть вопрос:

в api Bits типа Any. Как быть с этим типом и как представлять мне данные?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.11.2005 (Вт) 21:41

· lpvBits
Points to an array of color data used to set the colors in a rectangle of pixels...

Передавать массив. Или ссылку на массив - VarPtr(array).

Самому некогда проверять ((

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 01.11.2005 (Вт) 22:36

Ошибка Type mismatch!

См код:

Код: Выделить всё
Public Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long


Public Type ColTable
    rgbRed As Byte
    rgbGreen As Byte
    rgbBlue As Byte
    rgbReserved As Byte
End Type

Public Type sBITMAP
    bmfhSize As Long
    bmfhOffsetBits As Long
    bmihSize As Long
    bmihWidth As Long
    bmihHeight As Long
    bmihPlanes As Integer
    bmihBitCount As Integer
    bmihCompression As Long
    bmihSizeImage As Long
    bmihXpelsPerMeter As Long
    bmihYpelsPerMeter As Long
    bmihColorsUsed As Long
    bmihColorsImportant As Long
    bmpColorTable(0 To 255) As ColTable
    bmpImage() As Byte
End Type

Public Function LoadBitmap(FileName As String, StartByte As Long, FileLen As Long) As sBITMAP
Dim I As Long
Dim TmpBMP As sBITMAP
TmpBMP.bmfhSize = GetByte(FileName, StartByte + 2) + GetByte(FileName, StartByte + 3) * 256& + GetByte(FileName, StartByte + 4) * 256& ^ 2 + GetByte(FileName, StartByte + 5) * 256& ^ 3
TmpBMP.bmfhOffsetBits = GetByte(FileName, StartByte + 10) + GetByte(FileName, StartByte + 11) * 256& + GetByte(FileName, StartByte + 12) * 256& ^ 2 + GetByte(FileName, StartByte + 13) * 256& ^ 3
TmpBMP.bmihSize = GetByte(FileName, StartByte + 14) + GetByte(FileName, StartByte + 15) * 256& + GetByte(FileName, StartByte + 16) * 256& ^ 2 + GetByte(FileName, StartByte + 17) * 256& ^ 3
TmpBMP.bmihWidth = GetByte(FileName, StartByte + 18) + GetByte(FileName, StartByte + 19) * 256& + GetByte(FileName, StartByte + 20) * 256& ^ 2 + GetByte(FileName, StartByte + 21) * 256& ^ 3
TmpBMP.bmihHeight = GetByte(FileName, StartByte + 22) + GetByte(FileName, StartByte + 23) * 256& + GetByte(FileName, StartByte + 24) * 256& ^ 2 + GetByte(FileName, StartByte + 25) * 256& ^ 3
TmpBMP.bmihPlanes = GetByte(FileName, StartByte + 26) + GetByte(FileName, StartByte + 27)
TmpBMP.bmihBitCount = GetByte(FileName, StartByte + 28) + GetByte(FileName, StartByte + 29)
TmpBMP.bmihCompression = GetByte(FileName, StartByte + 30) + GetByte(FileName, StartByte + 31) * 256& + GetByte(FileName, StartByte + 32) * 256& ^ 2 + GetByte(FileName, StartByte + 33) * 256& ^ 3
TmpBMP.bmihSizeImage = GetByte(FileName, StartByte + 34) + GetByte(FileName, StartByte + 35) * 256& + GetByte(FileName, StartByte + 36) * 256& ^ 2 + GetByte(FileName, StartByte + 37) * 256& ^ 3
TmpBMP.bmihXpelsPerMeter = GetByte(FileName, StartByte + 38) + GetByte(FileName, StartByte + 39) * 256& + GetByte(FileName, StartByte + 40) * 256& ^ 2 + GetByte(FileName, StartByte + 41) * 256& ^ 3
TmpBMP.bmihYpelsPerMeter = GetByte(FileName, StartByte + 42) + GetByte(FileName, StartByte + 43) * 256& + GetByte(FileName, StartByte + 44) * 256& ^ 2 + GetByte(FileName, StartByte + 45) * 256& ^ 3
TmpBMP.bmihColorsUsed = GetByte(FileName, StartByte + 46) + GetByte(FileName, StartByte + 47) * 256& + GetByte(FileName, StartByte + 48) * 256& ^ 2 + GetByte(FileName, StartByte + 49) * 256& ^ 3
TmpBMP.bmihColorsImportant = GetByte(FileName, StartByte + 50) + GetByte(FileName, StartByte + 51) * 256& + GetByte(FileName, StartByte + 52) * 256& ^ 2 + GetByte(FileName, StartByte + 53) * 256& ^ 3
ReDim TmpBMP.bmpImage(0 To TmpBMP.bmihSizeImage - 1)
For I = 0 To 255
TmpBMP.bmpColorTable(I).rgbRed = GetByte(FileName, StartByte + 54 + I * 4 + 1)
TmpBMP.bmpColorTable(I).rgbGreen = GetByte(FileName, StartByte + 54 + I * 4 + 2)
TmpBMP.bmpColorTable(I).rgbBlue = GetByte(FileName, StartByte + 54 + I * 4 + 3)
TmpBMP.bmpColorTable(I).rgbReserved = GetByte(FileName, StartByte + 54 + I * 4 + 4)
Next I
For I = 0 To UBound(TmpBMP.bmpImage)
TmpBMP.bmpImage(I) = GetByte(FileName, StartByte + 54 + 1024 + I)
DoEvents
Next I
LoadBitmap = TmpBMP
End Function

Public Function GetByte(ByVal FileName As String, ByVal Address As Double) As Byte
On Error GoTo 1
Dim FN As Byte
Dim B As Byte
FN = FreeFile
Open FileName For Binary As FN
Get #FN, Address, GetByte
1: Close #FN
End Function


Это основные функции. А вот самая главная (по идее):

Код: Выделить всё
Public Function GetPicture(sPicture As sBITMAP) As Picture
Set GetPicture = CreateBitmap(sPicture.bmihWidth, sPicture.bmihHeight, sPicture.bmihPlanes, sPicture.bmihBitCount, VarPtr(sPicture.bmpImage))
End Function

Private Sub Form_Load()
Set Picture1.Picture = GetPicture(LoadBitmap("c:\4.bmp", 1, FileLen("c:\4.bmp")))
End Sub


Здеся .bmpImage ошибка выползает...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.11.2005 (Вт) 23:11

Что-то не так. Код не должен быть таким громоздким...
А что именно за ошибка? Если передавать не ссылку, а первый элемент массива, не легче?

Завтра посмотрю подробнее.

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 01.11.2005 (Вт) 23:31

Код не громоздкий, а просто кажется. Функции реабилитированны как раз для чтения по байтно из любого места файла. :idea:

Посмотри пожалуйста :(

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 03.11.2005 (Чт) 22:43

УМ-ГУ!
Amed!

Завтра посмотрю подробнее.


"Завтра" наступило уже сегодня, а точнее уже скоро наступит завтра. :D

Ты обешал посмотреть кодик :wink:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 164

    TopList