From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jean Louis Newsgroups: gmane.emacs.help Subject: Re: Screenshots, frame shots straight from Emacs Date: Fri, 23 Jul 2021 08:51:15 +0300 Message-ID: References: <87sg1dgbbk.fsf@omarpolo.com> <87pmwhg843.fsf@omarpolo.com> <8735t96mxj.fsf@omarpolo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="36858"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mutt/2.0.7+183 (3d24855) (2021-05-28) Cc: help-gnu-emacs , Omar Polo To: Hongyi Zhao Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Fri Jul 23 08:01:05 2021 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m6oF7-0009Mx-3s for geh-help-gnu-emacs@m.gmane-mx.org; Fri, 23 Jul 2021 08:01:05 +0200 Original-Received: from localhost ([::1]:35660 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m6oF6-0004Pv-00 for geh-help-gnu-emacs@m.gmane-mx.org; Fri, 23 Jul 2021 02:01:04 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:41554) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m6oAK-0004hG-Mk for help-gnu-emacs@gnu.org; Fri, 23 Jul 2021 01:56:08 -0400 Original-Received: from stw1.rcdrun.com ([217.170.207.13]:35801) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m6oAG-0006eY-AP for help-gnu-emacs@gnu.org; Fri, 23 Jul 2021 01:56:08 -0400 Original-Received: from localhost ([::ffff:197.157.0.30]) (AUTH: PLAIN admin, TLS: TLS1.3,256bits,ECDHE_RSA_AES_256_GCM_SHA384) by stw1.rcdrun.com with ESMTPSA id 0000000000057EA3.0000000060FA59D2.00007BC9; Thu, 22 Jul 2021 22:55:29 -0700 Mail-Followup-To: Hongyi Zhao , Omar Polo , help-gnu-emacs Content-Disposition: inline In-Reply-To: Received-SPF: pass client-ip=217.170.207.13; envelope-from=bugs@gnu.support; helo=stw1.rcdrun.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "help-gnu-emacs" Xref: news.gmane.io gmane.emacs.help:132067 Archived-At: * Hongyi Zhao [2021-07-23 03:53]: > 1. Have the delay feature, so that I can do some operations before the > screenshot is captured, say, click on mouse button, open a dropdown > menu, and so on. This improved function will allow that you invoke for example: C-5 M-x frameshot to delay for 5 seconds. But this Emacs function I think will not allow to get the screenshot of the dropdown, maybe it requires using threads, now I don't know how to do it within Emacs. (defun frameshot (&optional prefix) "Save Emacs frame as frame shot. Directory is determined by variable `frameshot-directory' and if not defined, it will be saved in the `$HOME' directory." (interactive "p") (let ((delay (or prefix 0))) (run-with-timer delay nil (lambda () (let* ((image (x-export-frames nil (or frameshot-format 'png))) (base-directory (or frameshot-directory (getenv "HOME"))) (directory (concat (file-name-as-directory base-directory) (format-time-string "%Y/%m/%Y-%m-%d/"))) (file (concat directory (format-time-string "Screenshot-%Y-%m-%d-%T.") (symbol-name frameshot-format)))) (make-directory directory t) (with-temp-file file (insert image)) (find-file directory) (message "Frame shot saved as `%s'" file)))))) To capture all screen I am using this external Common Lisp script, that invokes maim: #!/usr/bin/clisp (load "/home/data1/protected/Programming/git/RCDBusiness/lib/lisp/date-time.lisp") (defparameter *image-capture-program* "maim") (defparameter *image-type* ".png") (defparameter *image-directory* "/home/data1/protected/Media/Pictures/Screenshots") (let* ((filename (concatenate 'string (timestamp-filename) *image-type*)) (year (substring filename 0 4)) (month (substring filename 5 7)) (date (substring filename 0 10)) (directory (concatenate 'string *image-directory* "/" year "/" month "/" date "/")) (command (concatenate 'string *image-capture-program* " \"" directory filename "\"")) (rox-command (concatenate 'string "rox " directory))) (print directory) (print command) (ensure-directories-exist directory) (shell command) (shell rox-command)) You could install either `maim' or other system screenshot program and use that one. > 2. Have the post-processing feature, which can be used for some > touch I am not sure whether the recommended method here has these > characteristics. I am often using few simple functions for processing that invoke ImageMagick: (defvar *image-default-resize-size* 1536) (defvar *image-resize-sizes* '()) ;; This function optimizes image for websites to reach the optimum ;; Internet speed (defun optimize-image-jpg (file &optional quality) "Optimizes the JPG image with quality 70%" (if (rcd-which-list '("mogrify")) (let ((extension (file-name-extension file)) (quality (or quality "70"))) (when (string-match "\\(?:\\(?:jpe?\\|pn\\)g\\)" (downcase extension)) (message "Optimizing `%s'" file) (call-process "mogrify" nil "-sampling-factor" "4:2:0" "-strip" "-interlace" "JPEG" "-colorspace" "RGB" "-format" "jpg" "-quality" quality file) (message "Optimizing FINISHED for `%s'" file))) (rcd-warning-message "RCD ERROR: `mogrify' not found in $PATH"))) ;; Mark files in Dired, optimize images (defun optimize-jpg-images-dired () "Optimizes JPG images inside of Dired" (interactive) (let ((files (dired-get-marked-files))) (while files (optimize-image-jpg (pop files))) (revert-buffer))) (defun image-resize (file &optional size) "Resizes the JPG image with default size" (if (rcd-which-list '("mogrify")) (let ((extension (file-name-extension file))) (when (or (equal (downcase extension) "jpg") (equal (downcase extension) "png")) (let* ((file (shell-double-quote file)) (command (format "mogrify -resize %s \"%s\"" size file))) (message command) (call-process-shell-command command)))) (rcd-warning-message "RCD ERROR: `mogrify' not found in `$PATH'"))) ;; Mark files in dired, resize images (defun image-resize-dired () "Resizes images" (interactive) (let ((files (dired-get-marked-files)) (size (read-number "Size: " *image-default-resize-size* '*image-resize-sizes*))) (while files (image-resize (pop files) size)) (revert-buffer))) If you know what exactly you wish to do to images then it is possible to use same methods and invoke ImageMagick processing. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/