Страница 2 из 5

Re: Копирование экрана

Добавлено: 14 окт 2009, 11:29
atavin-ta
&quot писал(а):Формальный тип поля TBitmap.Handle void*, действительный по-моему HWND *.
Нет, наверное всё таки что-то другое. Но точно указатель.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
О нашёл! Приколитесь, указатель на HBITMAP! С этим ваша библиотека работает?
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Воще не понял, что скачалось. Примеры вижу, но не могу понять, на чём. А где библиотека?

Re: Копирование экрана

Добавлено: 14 окт 2009, 12:04
BBB
atavin-ta, библиотеки (т.е. DLL-файлы) лежат в подкаталоге lib.
Там же и *.lib-файлы (правда, я не знаю, каков у Борланда формат lib-ов).

Описания (h-файлы), как я уже писал - в каталоге include.

[quote="atavin-ta"]Вообще, библиотека работает с каким-то своим внутренним форматом - GFL_BITMAP. Который для пользователя библиотеки является "черным ящиком". Для манипулирования изображениями (с помощью этой же библиотеки) этого вполне хватает.
Чтобы преобразовать в другой, "общепринятый", формат, имеются вышеприведенные функции преобразования.

Вспоминаю, что я как-то пробовал отнисовывать на виндовом окне изображение, загруженное из файла этой библиотекой. Только писал я на Microsoft-овском C++ + MFC. Могу посмотреть (только не сейчас, исходник дома лежит), как именно. Правда, у тебя (у Борланда), походу, какой-то другой подход.

Re: Копирование экрана

Добавлено: 14 окт 2009, 13:12
atavin-ta
Похоже. Но совместимость кажется проглянула. Только объсни, как с учётом неопознанности либов (судя по всему, библиотек импрота) подключить дллку? Точно знаю, что можно. Но как?
&quot писал(а):Вообще, библиотека работает с каким-то своим внутренним форматом - GFL_BITMAP.
Это внутри. Но с каими-то же выходными форматами она тоже должна работать. Сам HBITMAP, ссылка или указатель на него входят в число этих фоматов? А в число входных входит HWND + RECT сами, ссылки или указатели на них, двумя параметрами или в виде полей чего-то третьего? Ничего другого я пока на вход предложить не могу.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
А нельзя прямо bitblt? Я полохо понимаю его параметры и что дополнительно к самой функции надо объявить и создать. Киньте пожалуйста примерчик и грубую оценку (достаточно порядка величины) времени его исполнения на четвёртом одноядерном пне с частотой порядка 1.7 ГГц. А для мелкосовтовскго c++а подскажи, как сохранить картинку на диск, имея только HBITMAP, и как загрузить файл с диска и засунуть его в HBITMAP с учётом того, что там нет методов, а HBITMAP валяется сам по себе без каких либо объектов каких либо классов.

Re: Копирование экрана

Добавлено: 14 окт 2009, 13:24
BBB
atavin-ta писал(а):Похоже. Но совместимость кажется проглянула. Только объсни, как с учётом неопознанности либов (судя по всему, библиотек импрота) подключить дллку? Точно знаю, что можно. Но как?
Насколько я помню (когда-то немного с Борланд C++ имел дело), в комплекте Борланд C++ есть утилита libmaker.exe (кажется, такое название, но могу ошибиться, ищи по смыслу). Она по DLL делает lib-файл именно в борландовском формате.
Это внутри. Но с каими-то же выходными форматами он тоже должна работать. Сам HBITMAP, ссылка или указатель на него входят в число этих фоматов? А в число входных входит HWND + RECT сами, ссылки или указатели на них, двумя параметрами или в виде полей чего-то третьего? Ничего другого я пока на вход предложить не могу.
Не очень понял вопроса. Декларации функций преобразования я приводил выше в этой теме.

Что касается gflImportFromHWND, то она получает изображение указанного окна (параметр HWND hwnd). Если передать hwnd=NULL, то это будет означать "весь экран". Параметром const GFL_RECT * rect можно ограничить область получаемого изображения. Если передать rect=NULL, то будет скопировано все содержимое окна hwnd (или всего экрана, если hwnd=NULL)

Re: Копирование экрана

Добавлено: 14 окт 2009, 13:33
atavin-ta
Ты при
&quot писал(а):Не очень понял вопроса. Декларации функций преобразования я приводил выше в этой теме.
Ты привёл
gflConvertBitmapIntoDIB
gflConvertBitmapIntoDIBSection
gflConvertBitmapIntoDDB
gflConvertBitmapIntoDDBEx.
Но по DIBу у меня только "энциклопедия графических форматов", а с чем его ест с++? Через HBITMAP, или может ещё как? А больше ничего даже близко не вижу в этой декларации. Кроме того, здесь битмап слева. Это что? Из HBITMAPа? И куда? Если в файл DIB, то возьму из него.

Re: Копирование экрана

Добавлено: 14 окт 2009, 14:04
BBB
atavin-ta,
Они преобразуют из const GFL_BITMAP *bitmap (см. header функций)
Во что именно, я не разбирался особо. Смотри по типам параметров.

HBITMAP и DIB - это не файлы.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
atavin-ta,
я подумал, может, проще будет через временный файл? Ведь в твоем TImage наверняка предусмотрена загрузка картинки из файла.
Тогда в общих чертах алгоритм будет выглядеть так:
1. "Фотографируем" нужную область экрвнв при помощи ф-ии gflImportFromHWND
2. Сохраняем полученную картинку во временный файл при помощи ф-ии gflSaveBitmap
3. Загружаем штатными средствами Delphi картинку из только что созданного временного файла в твой компонент.

Re: Копирование экрана

Добавлено: 15 окт 2009, 12:05
atavin-ta
&quot писал(а): HBITMAP и DIB - это не файлы.
По поводу HBITMAP согласен. Я и не считал его файлом. Но DIB? Описание DIB и BMP в "энциклопедии графических формтов" можно понять только так:
это два имени одного формата, но имя DIB применяется к образам файлов в памяти, в которых всё, что в данном формате можно менять, соотвтетсвует дисплейному адаптеру данной машины, а имя BMP - во всех остальных случаях.
&quot писал(а):я подумал, может, проще будет через временный файл?
Файл итак должен существовать. И в TImage надо запихать картинку. Я думал, что первичным будет TImage, а файл уже с него, но можно и наоброт.
&quot писал(а):в твоем TImage наверняка предусмотрена загрузка картинки из файла.
Для этого есть специальный метод. Называется LoadFromFile.

Re: Копирование экрана

Добавлено: 15 окт 2009, 12:29
BBB
atavin-ta писал(а): Файл и так должен существовать. И в TImage надо запихать картинку. Я думал, что первичным будет TImage, а файл уже с него, но можно и наоброт.
Ты раньше писал, что сохранять в файл должен TImage. Поэтому я так понял, что это требование этой задачи.
Ты, все-таки, уточни, какая в конечном итоге цель. Если получить файл с графическим изображением (а отображать его в каком-то твоем окне не обязательно), то это вообще в два вызова функции из этой библиотеки (ну, не считая еще двух вызовов ф-ий инициализации библиотеки и ее закрытия).

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

Re: Копирование экрана

Добавлено: 15 окт 2009, 12:40
atavin-ta
Цель: получить файл с изображением экрана или его части и загрузить его по сети в TImageы на других машинах (именно так, через файл), а копию этого изображения запихать для контроля в TImage на данной машине (где происходит съёмка экрана). Причём, сам контрольный TImage в момент съёмки на экране не присутствует.
&quot писал(а):Поэтому я так понял, что это требование этой задачи.
Нет. Требования задачи - получить две копии фрагмента экрана. Одно в окне TImage с возможностью отображения сразу после съёмки (вызывается мышью по закладке), другое - на диске в формате BMP и ни в каком другом. А SaveToFile или LoadFromFile - какая к хэлу разница? Важен формат дисковой копии, и факт существования одновременно обеих.

Re: Копирование экрана

Добавлено: 15 окт 2009, 12:49
BBB
atavin-ta писал(а):Требования задачи - получить две копии фрагмента экрана. Одно в окне TImage с возможностью отображения сразу после съёмки (вызывается мышью по закладке), другое - на диске в формате BMP и ни в каком другом. А SaveToFile или LoadFromFile - какая к хэлу разница? Важен формат дисковой копии, и факт существования одновременно обеих.
Фуфф..... Тогда возникает вопрос. Ну и ..... фигли исписана целая страница темы? :)
Ибо круг замыкается и я опять отсылаю сюда:

http://forum.developing.ru/showthread.php?t=9555

Там есть пример использования этой библиотеки. На cout внимания не обращай, т.к. они использованы для отладочного вывода ссообщений в случае ошибки. Можешь заменить на WINAPI-шный MessageBox или что там есть специфического в Борланде (ShowMessage?)

При сохранении в файл формата BMP нужно указать (это строка есть в примере):
rSaveParams.FormatIndex = 4; // BMP

А те строки, у которых имеется комментарий // for JPEG only можно вообще опустить.