Помогите плиз с SavePictureBytesToFile из modGDIPlus

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

Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение Mihail_ » 28.09.2009 (Пн) 18:22

Здравствуйте, есть байты изображения, нужно сохранить их в jpeg. Помогите плиз.
Нашел тут модуль и подготовил примерчик под это дело, но что-то ему не нравится.

Код: Выделить всё
Private Sub Command1_Click()
Dim p As StdPicture

GetObject Picture1.Image, Len(PicInfo), PicInfo
ReDim nBuffer(0 To PicInfo.bmWidthBytes * PicInfo.bmHeight) As Byte
GetBitmapBits Picture1.Image, UBound(nBuffer), nBuffer(0)

Set p = LoadPictureFromBytes(nBuffer, , , vbWhite, False, PicInfo.bmWidth, PicInfo.bmHeight)
Print SavePictureBytesToFile(nBuffer, "C:\snaaap.jpg", JPG, 50)

End Sub


У меня подозрение что он какие-то другие байты ожидает..
Вложения
bits2JPG.rar
(12.32 Кб) Скачиваний: 40

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

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение Andrey Fedorov » 29.09.2009 (Вт) 9:57

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

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение Mihail_ » 01.11.2009 (Вс) 14:25

в кирпичах сомнительный пример вообще без комментариев на эту тему.. хотя может я нашел неправильно..

помогите плиз - сохранить массив пикселов в джпег.. ну наверняка же такие функции у многих есть..

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

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение Andrey Fedorov » 01.11.2009 (Вс) 22:06

Пример приложен
Вложения
Sample.rar
(32.25 Кб) Скачиваний: 50
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение Mihail_ » 07.11.2009 (Сб) 16:04

да у меня был пример именно оттуда.. и адаптировать его под мои нужны так сходу не получается..
проблема в том что я получаю свои байты не из файла у меня просто есть массив пикселов формата RGB и известен размер конечной картинки. Больше ничего не известно.

А здесь только описательная структура формата, которую он извлекает из файла как минимум 35 байт имеет.. из которых еще фиг поймешь что за что отвечает.. например для вашей PNG картинки из примера она такая:

Код: Выделить всё
m(0) = 66
m(1) = 77
m(2) = 122
m(3) = 185
m(4) = 2
m(5) = 0
m(6) = 0
m(7) = 0
m(8) = 0
m(9) = 0
m(10) = 54
m(11) = 0
m(12) = 0
m(13) = 0
m(14) = 40
m(15) = 0
m(16) = 0
m(17) = 0
m(18) = 169
m(19) = 1
m(20) = 0
m(21) = 0
m(22) = 105
m(23) = 0
m(24) = 0
m(25) = 0
m(26) = 1
m(27) = 0
m(28) = 32
m(29) = 0
m(30) = 0
m(31) = 0
m(32) = 0
m(33) = 0
m(34) = 0


а дальше уже непосредственно цветовые пикселы, только до кучи еще на 1 пиксел > 3 байт отводится.. что вообще за цветовая модель не совсем понятно..

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение djalex777 » 07.11.2009 (Сб) 18:44

Andrey Fedorov писал(а):а дальше уже непосредственно цветовые пикселы, только до кучи еще на 1 пиксел > 3 байт отводится.. что вообще за цветовая модель не совсем понятно..

RGB

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

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение Andrey Fedorov » 07.11.2009 (Сб) 23:56

Mihail_ писал(а):да у меня был пример именно оттуда.. и адаптировать его под мои нужны так сходу не получается..
проблема в том что я получаю свои байты не из файла у меня просто есть массив пикселов формата RGB и известен размер конечной картинки. Больше ничего не известно.


Какая разница откуда он получен? В примерчике что я привел последовательность
Файл->Picture->Массив->Файл JPG
|->Picture->Файл PNG

Собственно массив может быть заполнен откуда угодно... Так что пример отвечает на изначально заданный вопрос - как сохранить массив рисунка в формате JPG. Естественно что в массиве должен быть рисунок. Полученный из файла, Picture, базы данных...

Не знаю откуда берутся конкретно ваши байты, но когда-то выдергивал из MDB-шки картинки сохраненные в Access-e - тот к ним вначале приделывал несколько(вроде три, но точно за давностью уже не помню) своих байтиков - их приходилось банально отсекать, после чего получались обычные BMP-шки...

Mihail_ писал(а):А здесь только описательная структура формата, которую он извлекает из файла как минимум 35 байт имеет.. из которых еще фиг поймешь что за что отвечает.. например для вашей PNG картинки из примера она такая:


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

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение Mihail_ » 08.11.2009 (Вс) 14:00

мои байты получаются с веб-камеры, но как говорится не все байты одинаково полезны :)
все-таки нам никаки не избавиться от первых 35 байтов которые нужны этому алгоритму чтобы сохранить изображение, но даже если мы их будем знать - надо еще преобразовать цвета так, чтобы алгоритм их скушал и выдал осмысленное изображение, а сейчас получается что мы им ему даем не в том формате (у нас RGB24, 3 байта (или 8 бит) на описание каждого из 3 цветов пиксела, 0-255 R, 0-255 G, 0-255 B) то есть все предельно просто 1 пиксел - 24 бита, а здесь алгоритм ожидает чего-то совершенно другого и из наших RGB24 у него ничего не получается..

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите плиз с SavePictureBytesToFile из modGDIPlus

Сообщение iGrok » 17.11.2009 (Вт) 21:31

Наконец-то дошли руки.

Там не 35, а 54 байта. Это BITMAPFILEHEADER + BITMAPINFOHEADER. Заполнить их - не проблема.
Ну и битмап он всё-таки хочет в стандартном виде - 32bpp.

З.Ы. Почему-то CopyMemory криво копировал bitmapfileheader в массив. При этом bitmapinfoheader копируется нормально. Я не понимаю природы этого явления, если честно. Поэтому в итоге заполнял BFH уже в массиве по одному значению.

З.З.Ы. Изображение получается перевёрнутым. Думается, это всё-таки косяки GetBitmapBits. Она всё-таки объявлена устаревшей, и рекомендуют вместо неё использовать GetDIBits.

З.З.З.Ы. Можно попробовать сделать то же самое с 24bpp, только указать соответствующий biBitCount. Я не пробовал, насколько это корректно - не помню, доки перечитывать - влом. Так что попробуй сам.
Вложения
bits2JPG_fixed.zip
(13.56 Кб) Скачиваний: 48
label:
cli
jmp label


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 85

    TopList