Перейти к содержимому
Asummonster

AsumScreenshoter - программа для создания "скриншотов" экрана

Рекомендуемые сообщения

Всем привет! В этой теме я расскажу о своей программе для создания и распечатывания скриншотов на моде OpenComputers!

Она получает разрешение экрана и с помощью двух циклов:

W, H = gpu.getResolution()
screen={}
for y=1, H do
  for x=1, W do
    symbol, color = gpu.get(x, y)
    table.insert(screen, symbol)
    table.insert(screen, color)
  end
end

Перебирает весь экран.

Сохраняет она его в файл /screenshots/Screenshot-Год-День-Час-Минута.ast

Формат ast --- это костыль под моим именем=) Сериализированная таблица - AsumScreenshotTable

Как это работает?

С помощью цикла сверху программа перебирает весь экран.

Она записывает символ, а потом его цвет в таблицу.

Потом,при запуске программы для считывания этого файла она превращает строку в таблицу, и перебирает её циклом 

for num=1, #screen-W-W, 2 do
  ...
end

Почему и зачем я два раза отнимаю ширину экрана?Потому,что сразу после отображения собирается вылезти курсор, то есть верхнюю строку мы не увидим. Зачем я перебираю всё через 1?Таким образом я не натыкаюсь на цвета,а только на символы с экрана. Потом я устанавливаю цвет тексту:

gpu.setForeground(screen[num+1])

Потом я отпечатываю сам символ с помощью io.write

Для выхода из программы после распечатывания экрана надо по нему нажать(создать ивент touch).

Вот код "AsumScreenshoter"'а:

--[[
=====================================================================================================
============   Программа для создания скриншотов в OpenComputers================================   ==
=============   Создана Asummonster для сайта computercraft.ru  =====================================
=====================================================================================================
=====================================================================================================
=====================================================================================================]]
fs=	require("filesystem")
gpu=	require("component").gpu
ser=    require("serialization").serialize
unser=  require("serialization").unserialize
event=  require("event")
args={...}
mode=args[1]
if mode==nil then
  print("Использование: screenshot init для создания ивента сохранения экрана(Кнопка Print Screen, папка screenshots)\n screenshot <имя файла> для просмотра(По окончанию просмотра нажмите на экран)"); os.exit()
end
function createScreenshotFile()
  DD, HH, MM, SS = os.date("%Y"), os.date("%H"), os.date("%M"), os.date("%S")
  if not fs.isDirectory("/screenshots") then fs.makeDirectory("/screenshots")
  end
  return io.open("/screenshots/Screenshot-"..DD.."-"..HH.."-"..MM.."-"..SS..".ast", "w")
end
function getScreen()
  screenshot={}
  W, H = gpu.getResolution()
  for y=1, H do
    for x=1, W do
      symbol, color = gpu.get(x, y)
      table.insert(screenshot, symbol)
      table.insert(screenshot, color)
    end
  end
return screenshot
end
function writeScreen()
  file=createScreenshotFile()
  file:write(ser(getScreen()))
  file:flush()
  file:close()
end
function printScreen(filename)
  screenshotRAW=io.lines(filename)()
  screenshot=unser(screenshotRAW)
  W, H = gpu.getResolution()
  for num=1, #screenshot-W-W, 2 do
    gpu.setForeground(screenshot[num+1])
    io.write(screenshot[num])
  end
  event.pull("touch")
end
function saveScreenByKey(_, _, key1, key2)
  if key1==0 and key2==183 then writeScreen()
  end
end
if mode=="init" then 
  event.listen("key_down", saveScreenByKey)
  else printScreen(mode)
end

Надеюсь вы будете пользоваться этой программой!=)

Для того,что бы начать делать скриншоты, после каждой перезагрузки надо запустить приложение с параметром init 

Для того,что бы создать скриншот после инициализации-надо нажать кнопку Print Screen

Изменено пользователем Asummonster

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

F2 нажми.


Делает снимок даже с цветом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

F2 нажми.

Делает снимок даже с цветом.

Во-во! С цветом и даже в PNG! Крутая штука, согласен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

:D

 

 

Монстрик сейчас отлучен от сервера и находится в изгнании. Поэтому он сейчас пишет миллион программок в день, чтобы реабилитироваться. Он завтра начнет писать OpenDirectX, почти уверен в этом=)

 

Но я же его предупреждал, чтобы не чебучил на сервере. На 5 мин. нельзя оставить админский комп (при чем именно тот единственный, на котором не был прописан аддюзер), как Монстрик уже там гм-ку себе пытается прописать, в каждую дюрдочку норовит залезть и вынюхивает там все, пытается прощимиться=). Как дети малые, или солдаты - только отвернулся, он уже задницу где-то отдавил или в самоволке уже в дюндель трезвый. Уже раз 5 его банили, наверное, лично я только 3 раза) У Нео, не давеча, спёр честно заработанные компы, тоже норку нашел.

 

Такое чувство, что Монстрик не играть пришел на сервак, а делать маленькие пакости в игре и рекурсивно вызывать кучу функций. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно я по теме? Считаю, что хранить картинку в виде сериализованной таблицы крайне не рационально. Куча лишних скобок, пробелов и запятых. Не хочешь подумать над более компактным форматом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно я по теме? Считаю, что хранить картинку в виде сериализованной таблицы крайне не рационально. Куча лишних скобок, пробелов и запятых. Не хочешь подумать над более компактным форматом?

Могу записывать просто в строку

Я просто выбрал самый лёгкий и надёжный вариант

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Самый легкий вариант не всегда самый лучший. Теоретически каждое знакоместо должно занимать в файле 2-3 байта. 1 байт - цвет и 1-2 байта - символ. А если еще упаковку применить ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Самый легкий вариант не всегда самый лучший. Теоретически каждое знакоместо должно занимать в файле 2-3 байта. 1 байт - цвет и 1-2 байта - символ. А если еще упаковку применить ...

По моему,25 килобайт за скриншот 80x25 не очень много весит, но я подумаю об изменении формата.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно я по теме? Считаю, что хранить картинку в виде сериализованной таблицы крайне не рационально. Куча лишних скобок, пробелов и запятых. Не хочешь подумать над более компактным форматом?

Истина!

Таблицы громоздки. Хранение одного большого экрана отожрет почти всю планку памяти тиер1, строкой хранить на несколько порядков компактнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Истина!

Таблицы громоздки. Хранение одного большого экрана отожрет почти всю планку памяти тиер1, строкой хранить на несколько порядков компактнее.

А как хранить строкой?Хотя,у меня есть идея....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По моему,25 килобайт за скриншот 80x25 не очень много весит, но я подумаю об изменении формата.

 

Монстер, у меня голограмма 48х32х48 весит всего 18,5 Кб. И это без сжатия, которе предлагал Зеро.

Так что - апргейдить! Однозначно апгрейдить!  :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Решил сделать TeamViewer на базе твоей программы, а фигу. Модем может передать максимум 8 КБ, а картинка весит 25 КБ. Вот согласен с Тоторо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Решил сделать TeamViewer на базе твоей программы, а фигу. Модем может передать максимум 8 КБ, а картинка весит 25 КБ. Вот согласен с Тоторо.

У меня есть тимвмвер!!!адын

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня есть тимвмвер!!!адын

Ну уж нет, так не интересно)) Я лучше сам свой сделаю)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Велосипедист

У нас здесь клуб велосипедистов )

 

Решил сделать TeamViewer на базе твоей программы, а фигу. Модем может передать максимум 8 КБ, а картинка весит 25 КБ. Вот согласен с Тоторо.

Передавать скриншотами - моветон. 

 

Заключай GPU-шные ф-и вывода в конверт и, при их вызове, передавай их на удаленный хост, а от хоста передавай события клавиатуры мыши и пуль их в очередь событий.

Вот и весь тимвьювер.

Изменено пользователем swg2you

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Он завтра начнет писать OpenDirectX, почти уверен в этом=)

Я его пишу XD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...