Вывести картинку имея массив CHAR ?

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

Вывести картинку имея массив CHAR ?

Сообщение ALX_2002 » 15.06.2006 (Чт) 12:05

Доброго дня товарищи. Меня тут товарищь озадачил - Говорит

Есть массив. В массиве хранятся картинки в виде строки CHAR

Нужно их выводить на форму. :shock:

Посоветуйте пожалста - чем бы это сделать ? :wink:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.06.2006 (Чт) 12:08

В массиве хранится ЧТО?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.06.2006 (Чт) 12:13

мне вот то же не понятно...
Вообще сохранить массив чаров в файл... И пусть LoadPicture выясняет, что там в этом массиве было, BMP, GIF, JPEG или еще чтото...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 15.06.2006 (Чт) 12:17

Вот я думал я один такой неграмотный и не знаю как это CHAR в массиве. А оказывается это товарисч мой словами непонятными говорит :-D

Я сам бы хотел знать что такое CHAR массив. Подозреваю, что это типа тела файла. :roll: :D

Думал вы меня посвятите в таиснтво смысла слова CHAR :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.06.2006 (Чт) 12:22

Что такое CHAR-массив, не имеет никакого значения.
Имеет значение, что в него записали.
Так что в него записали? Сырое бинарное в файловом формате? Декодированное? DIB? DDB?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.06.2006 (Чт) 12:23

CHAR это 1 байт, это все поняли...
Другое дело что не очень ясно как
а) Узнать размер этого массива
б) Есть много способов хранить картинку на компьютере... Какой тут не очень ясно...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.06.2006 (Чт) 12:25

А вот лингво для слова char знает аж четыре разных значения.
"1 байт" среди них нет ;-)

(ишь как вы меня со своим отравленным космосом зацепили, щас все подряд слова в лингво стал смотреть)
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.06.2006 (Чт) 12:27

Человек эрудированный, читавший главу 1 из любой книги по C++ догадается, о чем тут может говорится ;)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.06.2006 (Чт) 12:29

Lingvo Computers

char
= character

character (= CHR, char)

1) буква, литера
элемент шрифта или кодовой таблицы, задающий букву, цифру или другой символ
(см. тж. ASCII , character frequency , character generator , character height , control character , EBCDIC , Han character , hand-printed character , letter , national characters , Unicode )

2) символ, знак
простой встроенный тип данных в некоторых языках программирования (см. тж. alphanumeric character , character recognition , character set , data type , integer , symbol , word )

3) символьный, текстовый
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 15.06.2006 (Чт) 12:36

Товарищи. Чтобы не разводить флуда, я попробую у него всё точнее выяснить :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.06.2006 (Чт) 12:40

Давай, давай, спрашивай.
А то будет, как прошлый раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.06.2006 (Чт) 12:43

GSerg, я про значения: "поденная работа", "древесный уголь", "ручьевая форель" и "чай (разг.)"
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 15.06.2006 (Чт) 12:53

Код: Выделить всё

'*******************************************************************************
' Класс для загрузки изображений из байтового массива
' Накладыват интерфейсы IStream и IPicture на выделенную область памяти
'*******************************************************************************
Option Explicit
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As GUID) As Long
Private Declare Function IsEqualGUID Lib "ole32" (rguid1 As GUID, rguid2 As GUID) As Boolean
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As CBoolean, ppstm As Any) As Long
Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As CBoolean, riid As GUID, ppvObj As Any) As Long

Private Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
Private Const S_OK = 0
Private Const GMEM_MOVEABLE = &H2

Private Enum CBoolean
  CFalse = 0
  CTrue = 1
End Enum

Private Type GUID
  dwData1 As Long
  wData2 As Integer
  wData3 As Integer
  abData4(7) As Byte
End Type


Public Function CreatePicture(abPic() As Byte) As IPicture
  Dim nLow As Long
  Dim cbMem  As Long
  Dim hMem  As Long
  Dim lpMem  As Long
  Dim IID_IPicture As GUID
  Dim istm As stdole.IUnknown
  Dim ipic As IPicture
  ' получаем размер картинки
  On Error GoTo Out
  nLow = LBound(abPic)
  On Error GoTo 0
  cbMem = (UBound(abPic) - nLow) + 1
  ' Выделяем память
  hMem = GlobalAlloc(GMEM_MOVEABLE, cbMem)
  If hMem Then
    lpMem = GlobalLock(hMem)
      If lpMem Then
      'Копируем байты и разлочиваем область памяти
      MoveMemory ByVal lpMem, abPic(nLow), cbMem
      Call GlobalUnlock(hMem)
      ' Создаем интерфейст IStream
       If (CreateStreamOnHGlobal(hMem, CTrue, istm) = S_OK) Then
        If (CLSIDFromString(StrPtr(sIID_IPicture), IID_IPicture) = S_OK) Then
          ' Создаем интерфейс IPicture из IStream
          Call OleLoadPicture(ByVal ObjPtr(istm), cbMem, CFalse, IID_IPicture, CreatePicture)
        End If
      End If
    End If
  End If
     
Out:
End Function

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 15.06.2006 (Чт) 13:07

2 jangle :shock: WOW. Не хило.... Попробую ему это предложить.

К сожалению у него мобила заблочена. К вечеру выясню :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.06.2006 (Чт) 13:10

jangle
Ты по приведённой чуть выше ссылке ходил?
А ты сходи.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Dexion
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 15.06.2006 (Чт) 20:57

Сообщение Dexion » 15.06.2006 (Чт) 21:32

Привет всем.... я как раз тот человек которому по этой проблеме требуется помощь ....
Суть описываю ...
Есть dll-ка написаная на BC++ , в ней происходит получение картинки. получается она декодированием ... есть пример на BC++, получение проходит вот как
Код: Выделить всё
iDecompResult = DCI_DecompressImage(m_DataBlobCopy, m_DataBlob.Size,
                                m_DecompressedData, cDECOMPPICSIZE,
                                DCIStruct, &BmpInfoHdr);


m_DecompressedData - тип char* сюда пишется сама картинка - структура BMP

BmpInfoHdr - сюда заголовок bmp-шки, формат BITMAPINFOHEADER.

Вывод в с++ производится с помощью DrawDibDraw, для скорости я так понимаю


Код: Выделить всё
DrawDibDraw(m_DDH, PaintBox->Canvas->Handle,
              1, 1, PaintBox->Width-1, PaintBox->Height-1,
              &BmpInfoHdr, m_DecompressedData,
              0, 0, BmpInfoHdr.biWidth, BmpInfoHdr.biHeight,
              0)


Мне не нужно ее там выводить а надо передать себе в прогу и отобразить , передаю
1) структуру BITMAPINFOHEADER..
2) массив m_DecompressedData

Теперь у себя (пишу на c# но это не суть) пытаюсь сделать вывод на PictureBox...

так как точно не знаю как что работает , пытаюсь использовать все тот же DrawDipDraw -пока что возникают проблеммы - BufferOwerflowException - стандартная проблема при неверно переданных параметрах, может я ошибаюсь при передаче контекста устройства, но помоему при бередаче массива...
Дело в том что Char в c# занимает 2 байта, а в BC++ 1 байт... мне посоветовали попробовать получать как byte[] но у меня что то с этим немного не получилось .... завтра еще буду пытаться ... какие еще будут идеи??
Огромная просьба тех, кто знает как работает DrawDibDraw , обьяснить что же все таки туда нужно передавать p.s. так как в рабочей программе используется именно эта функция для вывода - то и формат данных для нее подходит - тогда вопрос - можно ли с этими данными использовать другой интерфейс вывода??? и есть ли смысл...

Более подробная инфа есть тут ... http://www.forum.ishodniki.ru/index.php?topic=6477
я там эту тему поднимал
СТОП !!!! И что дальше ? :shock:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.06.2006 (Пт) 11:34

ANDLL писал(а):CHAR это 1 байт, это все поняли...


Вообще-то, если CHAR это символ строки (а именно так это воспринимается в данной конференции), то это два байта в памяти, а не один. Ибо уенкод.

ANDLL писал(а):Другое дело что не очень ясно как
а) Узнать размер этого массива


См. UBound

ANDLL писал(а):б) Есть много способов хранить картинку на компьютере... Какой тут не очень ясно...


Видимо все-же массив байт. Ну а как его вывести вроде уже прописали...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 16.06.2006 (Пт) 11:56

Dexion
Скинь массив в файл и посмотри, что он из себя представляет. Для начала.
Лучший способ понять что-то самому — объяснить это другому.

Dexion
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 15.06.2006 (Чт) 20:57

Сообщение Dexion » 16.06.2006 (Пт) 13:41

Всем спасибо, проблема решена с помощью SetDIBitsToDevice....вопрос решен.. видимо тему можно закрывать
СТОП !!!! И что дальше ? :shock:


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

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

Сейчас этот форум просматривают: Google-бот и гости: 98

    TopList