Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как узнать, сколько байт занимает рисунок?


Автор: Тутанхамец 19.2.2006, 17:50
Хочу скопировать рисунок из PictureBox в массив байтов. Насколько я понимаю, свойство Image - это указатель... на что? на байты рисунка? Тогда скопировать их можно с помощью CopyMemory. Но как узнать, сколько байт он занимает?

Или хэндл битмапа - это указатель на какую-нибудь структуру?

Автор: cardinal 19.2.2006, 18:14
Про структуру bmp читай тут:
http://forum.vingrad.ru/index.php?showtopic=83898&view=findpost&p=645775

Автор: Тутанхамец 21.2.2006, 10:37
Спасибо, со структурой битмапа вроде понятно. Когда он лежит в файле.

А вот если он уже прочитан в picturebox? Что я найду в памяти, юзая Picture1.image как указатель?

Весь файл с BitmapFileHeader, BitmapInfoHeader и т.п.? Попытался через CоpyMemory - вроде непохоже ни на что.

В общем, как выглядит битмап, когда он лежит в оперативной памяти? И является ли .image тем же самым, что и HBITMAP.


Автор: Exception 21.2.2006, 11:46
А зачем тебе его копировать в массив байтов? Давай найдем другой путь решения задачи smile

Автор: cardinal 21.2.2006, 18:34
Вот и я думаю. Если он лежит в PictureBox, то значит он и на диске где-то лежит. Ну а если так, то посмотри тут пример...
http://vingrad.ru/VB-VB-002142
p.s. так и не дописал статью кстати... smile

Автор: Exception 21.2.2006, 19:29
Кстати, в каком-то из свойств хранится hBitmap картинки. Через него и можно ее потом использовать.

Автор: Тутанхамец 21.2.2006, 19:46
Цитата

Кстати, в каком-то из свойств хранится hBitmap картинки. Через него и можно ее потом использовать


Кажется, это свойство Image.

Цитата

А зачем тебе его копировать в массив байтов? Давай найдем другой путь решения задачи


А надо-то (кроме ослиного упрямства smile ) вот зачем. Мне надо складывать несколько картинок в один файл, а потом в процессе работы программы загружать в Picture (или рисовать прямо на форме) то одну, то другую.

Складывать файлы картинок в один файл (назовем его "общий") я могу. Но вот когда надо загружать их в Picture возникают проблемы. Можно, конечно, выдирать картинку из "общего" файла в память, скидывать во временный файл (с одной-единственнйо кратинкой), читать этот временный файл в PictureBox и стирать его с диска. Но, во первых, это некрасиво. Во вторых, это медленно. Я хочу считать все картинки из "общего" файла в оперативную память и прямо из памяти грузить их в PictureBox. Но как получить HBITMAP чего-то, что лежит в оперативке?

В общем вопрос такой - как обойтись без посредничества временного файла?

Если бы знать, сколько байт занимает картинка, когда она в PictureBox, то я бы просто скопировал эти байты, а потом запихнул бы их обратно.

Автор: SCINER2 28.2.2006, 12:40
Что-то форум не пускает меня под старым ником SCINER =(
Вот:
Код
Option Explicit

Private Const OBJ_BITMAP = 7
Private Type BITMAP '14 bytes
  bmType As Long
  bmWidth As Long
  bmHeight As Long
  bmWidthBytes As Long
  bmPlanes As Integer
  bmBitsPixel As Integer
  bmBits As Long
End Type
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long

Private Sub Form_Load()
  Dim Bmp As BITMAP
  Call GetObject(Picture1.Picture.Handle, Len(Bmp), Bmp)
  MsgBox Bmp.bmWidth & "x" & Bmp.bmHeight & "x" & Bmp.bmBitsPixel & vbCrLf & _
         "размер " & Bmp.bmWidth * Bmp.bmHeight * (Bmp.bmBitsPixel \ 8) & " байт"
End Sub

Автор: Тутанхамец 28.2.2006, 19:06
Да! smile Кажется, это то, что надо! Большое спасибо!


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)