Страница 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
Дед Пахом
Игорь Столяров писал(а): 27 Январь 2020, 9:51 Dispose(Buffer)
Может, 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 байта, причём последний нулевой. Уже не помню почему. Наверно, в стандарте так.