Картинка из буфера DIB

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Картинка из буфера DIB

Сообщение Игорь Столяров »

Привет всем !

Пытаюсь третий день решить простую (вроде бы) задачу и вообще нет развития отношений. :(
Внешняя 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 из буфера, подскажите пожалуйста правильное направление.
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Картинка из буфера DIB

Сообщение Yufil »

Посмотри в ClarionFreeImage - http://clarionfreeimage.com/
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4558
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Картинка из буфера DIB

Сообщение finsoftrz »

Не знаю, то или не то. Сохранение картинки из буфера обмена в файл, используя freeImage. Я отдельным exe делаю, так как эта либа может конфликтовать в некоторых версиях винды и валить приложение в gpf.
Вложения
ClipToJp.clw
(4.25 КБ) 184 скачивания
C6/C11, ШВС, tps/btrieve.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Картинка из буфера DIB

Сообщение Yufil »

У меня во всех программах стоит Prop:Printmode = 3, тогда в качестве исходных данных можно брать просто графический файл и не возиться с внутренними графическими форматами, данные сохраняются в jpg, а потом загружаются оттуда.

?Image{Prop:PrintMode}=3
?Image{Prop:ImageBlob}=Doc:Value{Prop:Handle}


Doc:Value - это Blob-поле с атрибутом Binary, туда запихнули обычный jpg - файл. Как раз средствами FreeImage, насчёт gpf подтверждаю.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Картинка из буфера DIB

Сообщение kreator »

Может сделать как в хелпе:
?Image{PROP:PrintMode} = 3 !Setup to store native and DIB formats
?Image{PROP:Text} = FileName
?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Картинка из буфера DIB

Сообщение Игорь Столяров »

Yufil писал(а): 27 Январь 2020, 10:33 Как раз средствами FreeImage, насчёт gpf подтверждаю
Вот и я о том же, к тому же там навороты методов.
А тут ведь задача простая и казалось бы есть очевидное решение штатными средствами …

Через файл - всё прекрасно работает, но тут как раз-таки и хочется уйти от сохранения картинки в файл из DLL
только для того, что бы потом этот файл загрузить в IMAGE. :(
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Картинка из буфера DIB

Сообщение kreator »

С "?Image{Prop:PrintMode}=3" не работает?
А если посмотреть, что лежит в переменной Buffer? У меня что-то было похожее. Но я работал с BMP-форматом. Он простой, без кодирования. Из строки в картинку и обратно без проблем гонялось.
We are hard at work… for you. :)
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Картинка из буфера DIB

Сообщение Constantine »

Можно попробовать размер строки подсчитать следующим образом:

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

             
             !Вычисляем размер (ширину) строки для 24 бит
             BYTELINE=BAND((LOC:WIDTH*3+3),0FFFFFFFCH)  !Другой вариант: BYTELINE=((WIDTH#*24+31)/32)*4
             !Создаем буфер для строки 24 бит
             SREF &= NEW STRING(BYTELINE)
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Картинка из буфера DIB

Сообщение kreator »

Ещё пять копеек. Посмотрел у себя. Картинка, которая у меня в BMP для манипуляций, содержит не только пиксели/точки, но и заголовок BMP-файла. Может в этом дело?
We are hard at work… for you. :)
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Картинка из буфера DIB

Сообщение Constantine »

Там может быть два заголовка: собственно, заголовок bitmap - BITMAPINFOHEADER и заголовок файла *.BMP - BITMAPFILEHEADER.
Зависит от того, что именно сформировала внешняя функция.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Картинка из буфера DIB

Сообщение Дед Пахом »

Игорь Столяров писал(а): 27 Январь 2020, 9:51 Dispose(Buffer)
Может, Dispose слишком рано вызвали?
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Картинка из буфера DIB

Сообщение Yufil »

У меня скриншот экрана получался в виде 32-битного bmp. Причём часть объектов на скриншоте отсутствовала. От идеи отказался...
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Картинка из буфера DIB

Сообщение Constantine »

Чтобы все было нормально, этот скриншот нужно конвертировать в 24-бит. Геморрой еще тот! :-) Но работает.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Картинка из буфера DIB

Сообщение Игорь Столяров »

kreator писал(а): 27 Январь 2020, 11:06 Картинка, которая у меня в BMP для манипуляций, содержит не только пиксели/точки, но и заголовок BMP-файла. Может в этом дело?
Спасибо - похоже оно и есть.
DIB структура для IMAGE должна содержать заголовок и собственно сам Bitmap с картинкой …
А я пытаюсь поженить IMAGE и Bitmap напрямую. Буду копать в эту сторону.
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Картинка из буфера DIB

Сообщение kreator »

Я так понимаю, dib это тот же bmp. Если надо, могу дать код формирования шапки. Кларионовский. Чтобы не напрягать стороннюю программу.
Только у меня bmp 4 байта, причём последний нулевой. Уже не помню почему. Наверно, в стандарте так.
We are hard at work… for you. :)
Ответить