Страница 1 из 3
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 9:51
Игорь Столяров
Привет всем !
Пытаюсь третий день решить простую (вроде бы) задачу и вообще нет развития отношений.
Внешняя DLL формирует буфер с картинкой в обычном DIB формате (3 байта на пиксель) и возвращает её размер.
OK ! Выводим картинку в IMAGE:
Код: Выделить всё
Buffer &String ! Буфер для bitmap
Code
BytesToRead = bitmap_width * bitmap_height * 3
Buffer &= New(String(xBytesToRead))
If ~(Buffer &= NULL)
memcpy(Address(Buffer), bitmap, BytesToRead)
?Image{Prop:PrintMode} = 1 ! DIB формат
?Image{Prop:ImageBits} = Buffer
Dispose(Buffer)
end
И вроде бы всё хорошо … но совсем не работает.
Если кто-нибудь сталкивался с загрузкой графики в IMAGE из буфера, подскажите пожалуйста правильное направление.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 10:16
Yufil
Посмотри в ClarionFreeImage -
http://clarionfreeimage.com/
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 10:20
finsoftrz
Не знаю, то или не то. Сохранение картинки из буфера обмена в файл, используя freeImage. Я отдельным exe делаю, так как эта либа может конфликтовать в некоторых версиях винды и валить приложение в gpf.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 10:33
Yufil
У меня во всех программах стоит Prop:Printmode = 3, тогда в качестве исходных данных можно брать просто графический файл и не возиться с внутренними графическими форматами, данные сохраняются в jpg, а потом загружаются оттуда.
?Image{Prop:PrintMode}=3
?Image{Prop:ImageBlob}=Doc:Value{Prop:Handle}
Doc:Value - это Blob-поле с атрибутом Binary, туда запихнули обычный jpg - файл. Как раз средствами FreeImage, насчёт gpf подтверждаю.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 10:35
kreator
Может сделать как в хелпе:
?Image{PROP:PrintMode} = 3 !Setup to store native and DIB formats
?Image{PROP:Text} = FileName
?
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 10:39
Игорь Столяров
Yufil писал(а): ↑27 Январь 2020, 10:33
Как раз средствами FreeImage, насчёт gpf подтверждаю
Вот и я о том же, к тому же там навороты методов.
А тут ведь задача простая и казалось бы есть очевидное решение штатными средствами …
Через файл - всё прекрасно работает, но тут как раз-таки и хочется уйти от сохранения картинки в файл из DLL
только для того, что бы потом этот файл загрузить в IMAGE.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 10:48
kreator
С "?Image{Prop:PrintMode}=3" не работает?
А если посмотреть, что лежит в переменной Buffer? У меня что-то было похожее. Но я работал с BMP-форматом. Он простой, без кодирования. Из строки в картинку и обратно без проблем гонялось.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 10:48
Constantine
Можно попробовать размер строки подсчитать следующим образом:
Код: Выделить всё
!Вычисляем размер (ширину) строки для 24 бит
BYTELINE=BAND((LOC:WIDTH*3+3),0FFFFFFFCH) !Другой вариант: BYTELINE=((WIDTH#*24+31)/32)*4
!Создаем буфер для строки 24 бит
SREF &= NEW STRING(BYTELINE)
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 11:06
kreator
Ещё пять копеек. Посмотрел у себя. Картинка, которая у меня в BMP для манипуляций, содержит не только пиксели/точки, но и заголовок BMP-файла. Может в этом дело?
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 11:16
Constantine
Там может быть два заголовка: собственно, заголовок bitmap - BITMAPINFOHEADER и заголовок файла *.BMP - BITMAPFILEHEADER.
Зависит от того, что именно сформировала внешняя функция.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 11:23
Дед Пахом
Может, Dispose слишком рано вызвали?
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 11:45
Yufil
У меня скриншот экрана получался в виде 32-битного bmp. Причём часть объектов на скриншоте отсутствовала. От идеи отказался...
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 11:49
Constantine
Чтобы все было нормально, этот скриншот нужно конвертировать в 24-бит. Геморрой еще тот!
Но работает.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 12:18
Игорь Столяров
kreator писал(а): ↑27 Январь 2020, 11:06
Картинка, которая у меня в BMP для манипуляций, содержит не только пиксели/точки, но и заголовок BMP-файла. Может в этом дело?
Спасибо - похоже оно и есть.
DIB структура для IMAGE должна содержать заголовок и собственно сам Bitmap с картинкой …
А я пытаюсь поженить IMAGE и Bitmap напрямую. Буду копать в эту сторону.
Картинка из буфера DIB
Добавлено: 27 Январь 2020, 15:03
kreator
Я так понимаю, dib это тот же bmp. Если надо, могу дать код формирования шапки. Кларионовский. Чтобы не напрягать стороннюю программу.
Только у меня bmp 4 байта, причём последний нулевой. Уже не помню почему. Наверно, в стандарте так.