purebasic.info

PureBasic forum
Текущее время: Вт окт 23, 2018 8:41 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Скриншот
СообщениеДобавлено: Ср июн 06, 2012 11:15 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июн 05, 2011 5:56 pm
Сообщений: 72
Откуда: Бендеры
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Доброго времени суток!
Проблема такая, есть код на WinApi для снятия скриншота, ищу нечто подобное под Linux
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Procedure Screenshot(ImageNr,hwnd,Width,Height)
  hImage = CreateImage(ImageNr,Width,Height)
   hdc = StartDrawing(ImageOutput(1))
    BitBlt_(hdc,0,0,Width,Height,GetDC_(hwnd),0,0,#SRCCOPY)
    StopDrawing()
    ReleaseDC_(hWnd,WndDC)
   ProcedureReturn hImage
 EndProcedure
 
 ShotWindow = FindWindow_(0, title$)
  If ShotWindow
    myImage = Screenshot(1,ShotWindow,WindowWidth(#Window_0),WindowHeight(#Window_0)-52)
    SaveScreenShot$ = InputRequester("Canaan Open Community Client",input_screen_name$,"screenshot1")
    SaveImage(1,"screenshots\"+SaveScreenShot$+".png",#PB_ImagePlugin_PNG)
  EndIf
 


_________________
Русский поисковик PureBasic | Мой блог | Мои работы | PureBasic 5.00 Linux & Windows


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 3:46 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
AgManiX

http://purebasic.info/phpBB2/viewtopic.php?p=37979#37979

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 9:38 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июн 05, 2011 5:56 pm
Сообщений: 72
Откуда: Бендеры
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
lakomet
спасибо!
Только вот теперь такой вопрос: как обрезать картинку сверху?
Ну то есть снизу обрезается при помощи указания размера WindowHeight(0)-52, а вот сверху как обрезать эти 52 пикселя?

_________________
Русский поисковик PureBasic | Мой блог | Мои работы | PureBasic 5.00 Linux & Windows


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 9:44 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11303
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AgManiX писал(а):
Только вот теперь такой вопрос: как обрезать картинку сверху?
GrabImage().
Ну или пошаманить с третим аргументом BitBlt_().

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 10:19 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июн 05, 2011 5:56 pm
Сообщений: 72
Откуда: Бендеры
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
GrabImage().
Ну или пошаманить с третим аргументом BitBlt_().

с GrabImage что-то мы не сошлись характерами - проблема та же
а что, BitBlt_() - кроссплатформенная функция? О_О

_________________
Русский поисковик PureBasic | Мой блог | Мои работы | PureBasic 5.00 Linux & Windows


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 10:24 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11303
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AgManiX писал(а):
с GrabImage что-то мы не сошлись характерами
По моему весьма приятная функция. Как можно было с ней не подружиться?

AgManiX писал(а):
а что, BitBlt_() - кроссплатформенная функция?
Нет, но в первом после она используется, вот я и предложил как вариант.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 10:31 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июн 05, 2011 5:56 pm
Сообщений: 72
Откуда: Бендеры
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):

По моему весьма приятная функция. Как можно было с ней не подружиться?

ну она ничего не дала - получился тот же результат, что и без нее
Пётр писал(а):
Нет, но в первом после она используется, вот я и предложил как вариант.

а, нет, я сейчас под линь делаю

я думал через gdk_pixbuf_get_from_drawable_() сделать, но когда dest_x или dest_y равны любому числу, отличному от нуля, у меня появляется предупреждение: GdkPixbuf(CRITICAL): gdk_pixbuf_new_subpixbuf: assertion `src_y>= 0 && src_y +height <= src_pixbuf->height' failed

_________________
Русский поисковик PureBasic | Мой блог | Мои работы | PureBasic 5.00 Linux & Windows


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 10:34 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11303
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AgManiX писал(а):
ну она ничего не дала
Значит что-то не так сделал.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 07, 2012 12:54 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
AgManiX
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ExamineDesktops() 
x = 0
y = 0
x2 = 100
y2 = 100
w = 500
h = 300
OpenWindow(1, x2, y2, w, h, "окно которое будем фотать");можешь поставить #PB_Window_BorderLess
If OpenWindow(0, x, y, w, h, "1", #PB_Window_Invisible)
     Delay(100)
     *src.GdkDrawable = gdk_window_lookup_(gdk_x11_get_default_root_xwindow_())  
     *pixbuf = gdk_pixbuf_get_from_drawable_(#Null, *src, #Null, x2, y2, 0, 0, w, h)
     
     ImageGadget(0, x, y, w, h, *pixbuf)
     CloseWindow(1);можешь и не закрывать
     HideWindow(0, 0)
     
     Repeat
          EventID = WaitWindowEvent()
     Until EventID = #PB_Event_CloseWindow
     
EndIf



Пы.Сы. Ну а вообще нужно всё это делать через XLib, во первых будет бысрей работать, во вторых можешь сфотать любое окно даже если оно в данный момент скрыто другими окнами.

Пы.Сы.Сы. Пример пока привести не могу, слегка занят другим, может чуть позже.

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт май 03, 2013 10:10 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 22, 2011 6:01 pm
Сообщений: 161
Откуда: Из цепких лап смерти
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
lakomet писал(а):
Пы.Сы. Ну а вообще нужно всё это делать через XLib, во первых будет бысрей работать, во вторых можешь сфотать любое окно даже если оно в данный момент скрыто другими окнами.


Очень надо такой пример. Как вариант, через Qt, а не через Xlib. Вот что я нашёл самостоятельно - http://doc.crossplatform.ru/qt/4.4.3/de ... nshot.html

К сожалению, я в сях полный ноль. Задача: сделать библиотеку, которая предоставляет следующую функцию: скриншот верхнего (или активного, смотря что проще реализовать) Qt-окна (или всего экрана, как проще) преобразовывается к определённому виду. В качестве результата выдаётся указатель на массив байт. Например, XXYYRGBRGBRGB... где XX - ширина, YY - высота, RGB - цвет пикселя.

_________________
Восход красного карлика - закат империи. Конец света оказался всего лишь затмением.
Я не буду платить за ваши преступления, нимб над моим черепом - обман зрения.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс май 05, 2013 1:41 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Пятисотый писал(а):
Очень надо такой пример.

Кто-нибудь понял че-нибудь? Мой мозг отказался переваривать эту инфу

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс май 05, 2013 2:51 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 22, 2011 6:01 pm
Сообщений: 161
Откуда: Из цепких лап смерти
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
pablov писал(а):
Пятисотый писал(а):
Очень надо такой пример.

Кто-нибудь понял че-нибудь?


Я привык писать чётко, ёмко и кратко, без малейшего пространства для недопонимания. Как ни странно, именно из-за этого меня часто не понимают.

Подключаем к проге Х библиотеку Y (её и надо написать на ПБ). Вызываем из Y функцию (передав туда координаты прямоугольной области экрана). Либа Y делает скриншот, вырезает эту область, обрабатывает картинку и конвертирует. И выдаёт программе Х (которая может быть на чём угодно, хоть на ПБ, хоть на С++) указатель на эти данные. Мы читаем оттуда четыре байта. Первые два - ширина. Следующие два - высота. Теперь мы знаем, сколько байт читать дальше.

А теперь перечитайте мой первый пост. Я там написал точно то же самое, только сухо. Почему без воды люди не понимают? Гуманоиды такие гуманоиды.

Цитата:
Мой мозг отказался переваривать эту инфу


Вот человек пытался решить похожую задачу - http://linuxforum.ru/viewtopic.php?id=27472

В конце он написал, что решил её, но я так и не понял - как. Сам я пока нашёл GraphicsMagick и его XML-язык Magick Scripting Language. Вроде подходит, но если кто-то предложит более удобное и простое решение - буду крайне признателен.

_________________
Восход красного карлика - закат империи. Конец света оказался всего лишь затмением.
Я не буду платить за ваши преступления, нимб над моим черепом - обман зрения.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс май 05, 2013 3:47 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
Пятисотый
Пурик и Qt? Эт конечно сильно :D
А по делу, то чем не устраивает XLib? Qt, GTK, E17 и т.д. это всё обёртки над xlib. Пока иксы не выпилили, самое быстрое и простое - это использовать xlib. Меня пока этот вопрос не интересует, когда будет время, я обязательно добъю этот вопрос. Для меня вся проблема перевода сишных примеров в пурик - это сишные структуры. Чтоб сделать скриншот используя xlib, нужно перевести одну сишную структуру(моих мозгов на это не хватает :cry: ), и тогда скрин делается в три строки.

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс май 05, 2013 3:48 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 22, 2011 6:01 pm
Сообщений: 161
Откуда: Из цепких лап смерти
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Меня устроит ЧТО УГОДНО, если это позволит легко и просто решить мою задачу.

_________________
Восход красного карлика - закат империи. Конец света оказался всего лишь затмением.
Я не буду платить за ваши преступления, нимб над моим черепом - обман зрения.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс май 05, 2013 3:55 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
Пятисотый
Гугли XGetImage()

_________________
.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB