Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Загрузка картинки из файла Добавлено: 03.02.09 15:19  

Автор вопроса:  AWP | Web-сайт: xawp.narod.ru | ICQ: 345685652 
Опять нужен хелп.

Есть файл, в нём архивом лежат кучу картинок.
Знаем начало картинки в файле, знаем размер.

Нужно загрузить её либо в pictureBox либо в DC.

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #1 Добавлено: 03.02.09 16:16
Вопрос почти полностью повторяет недавний от Леши - http://www.vbnet.ru/forum/show.aspx?id=182404
Я для начала бы вытащил эту порцию байтов в массив, записал в новый файл и загружал бы обычным образом.

Ответить

Номер ответа: 2
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #2
Добавлено: 03.02.09 16:36
Для начала так и есть, но не очень хорошо.

Виртуальный файл в оперативке можно как-нибудь создать?

Ответить

Номер ответа: 3
Автор ответа:
 Kardinal



ICQ: 360041513 

Вопросов: 1
Ответов: 164
 Web-сайт: kg7.ru
 Профиль | | #3
Добавлено: 03.02.09 17:48
А чем он будет отличаться от реального? Потому как в вб файл в оперативу не копируеться. Виртуальным файлом может быть и массив, как это верно подмечено.

Ответить

Номер ответа: 4
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #4
Добавлено: 04.02.09 01:58
Ну как-то давно я видел пример создания вирт. файл, но как его повторить не знаю.
А массив не подходит. Ну сами понимаете, это картинка(может быть разный формат) + перепостроение картинки из массива по точечно...
Нужен либо вирт. файл либо загрузка из данных.

Ответить

Номер ответа: 5
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #5
Добавлено: 05.02.09 09:22
Ну в общем алгоритм примерно следующий:
1. выделить память сколько требуется под файл.
2. скопировать в эту область содержимое графического файла.
3. выяснить тип файла картинки (по сигнатурам или по расширению).
4. создать битмэп из данных в памяти при помощи gdiplus и необходимого кодека.
5. отобразить битмэп в нужном контексте устройства

Ответить

Номер ответа: 6
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #6
Добавлено: 07.02.09 20:34
Проблема решена!
  1.  
  2. Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long
  3. Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, ByRef riid As Byte, ppvObj As Any) As Long
  4. Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, ByRef pclsid As Byte) As Long
  5. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
  6. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  7. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  8.  
  9. Private Function PictureFromMemory(ByRef btData() As Byte) As IPicture
  10.     Dim IID_IPicture(16) As Byte
  11.     Dim pGlobal As Long, pStream As IUnknown
  12.  
  13.     Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
  14.  
  15.     pGlobal = GlobalAlloc(0&, UBound(btData) + vbNull)
  16.     Call CopyMemory(ByVal pGlobal, btData(0), UBound(btData) + vbNull)
  17.  
  18.     If CreateStreamOnHGlobal(pGlobal, True, pStream) = 0& Then
  19.         If CLSIDFromString(StrPtr(sIID_IPicture), IID_IPicture(0)) = 0& Then
  20.             Call OleLoadPicture(ByVal ObjPtr(pStream), UBound(btData) + vbNull, False, IID_IPicture(0), PictureFromMemory)
  21.         End If
  22.     End If
  23.     If PictureFromMemory Is Nothing Then Call GlobalFree(pGlobal)
  24. End Function
  25.  
  26. Private Sub Command1_Click()
  27. Dim D() As Byte
  28. FileName = "D:\VBProjects\GAMES\Bomber\data\1.bmp"
  29. LN = FileLen(FileName)
  30. ReDim D(LN - 1)
  31. Open FileName For Binary As #1
  32.   Get #1, 1, D
  33. Close #1
  34. Form1.Picture = PictureFromMemory(D)
  35. End Sub

Ответить

Номер ответа: 7
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #7
Добавлено: 09.02.09 14:52
Молодец! Только через OleLoadPicture, если не ошибаюсь, загрузить png с альфа-каналом не получится. Я прав?

Ответить

Номер ответа: 8
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #8
Добавлено: 11.02.09 00:04
Думаю да. Но нам 24 бит хватит)))

Ответить

Номер ответа: 9
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #9 Добавлено: 13.02.09 10:37
а TGA оно умеет загружать, мм?

Ответить

Номер ответа: 10
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #10
Добавлено: 15.02.09 23:38
Справочник API вам точнее скажет.
Но я уверен, что нет. Хотя это и не большая проблема, которую можно легко решить.

Ответить

Номер ответа: 11
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #11
Добавлено: 16.02.09 09:21
Наверняка нет, проверил в MSDN. Можно подгрузить какую-нибудь стороннюю библиотеку по работе с графикой.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам