From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Hongyi Zhao Newsgroups: gmane.emacs.help Subject: Re: Screenshots, frame shots straight from Emacs Date: Fri, 23 Jul 2021 16:56:43 +0800 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" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="2270"; mail-complaints-to="usenet@ciao.gmane.io" To: Hongyi Zhao , Omar Polo , help-gnu-emacs Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Fri Jul 23 10:57:23 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 1m6qzi-0000QW-EL for geh-help-gnu-emacs@m.gmane-mx.org; Fri, 23 Jul 2021 10:57:22 +0200 Original-Received: from localhost ([::1]:54562 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m6qzh-0001Uf-FK for geh-help-gnu-emacs@m.gmane-mx.org; Fri, 23 Jul 2021 04:57:21 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:42306) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m6qzM-0001SS-0J for help-gnu-emacs@gnu.org; Fri, 23 Jul 2021 04:57:00 -0400 Original-Received: from mail-lf1-x12a.google.com ([2a00:1450:4864:20::12a]:40514) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1m6qzJ-00077L-JO for help-gnu-emacs@gnu.org; Fri, 23 Jul 2021 04:56:59 -0400 Original-Received: by mail-lf1-x12a.google.com with SMTP id h14so899825lfv.7 for ; Fri, 23 Jul 2021 01:56:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=FzCPyHJ0lS7Dsfd+Xdg3GwESQ5Yx6zOMSzk4fmDnMtg=; b=kbvfWN2soZSoVnFzflNH62R8EI0d95ZcixNl2jSO/JmssmNyAmDaEPSiXrpyIiiY6U CnlAwiHfTn/cgpsMJF7ujDlvrgCRrwFvjoHdJLl03pgf9xOVcWbMuknxTs7E3znNVemt i0YiNQRhNtswJOxYn9OuE7ucG4r6jizb98c+ZQGXuOoqtgJ7fTg2rLOB7i5wJ1a079Pr aRQUttiyquuyQiB7IFXXaxeAzVZwKMX932c1y6aG+FCPFHR/nMPOANDAMewBjhgCjpE1 BbpGxuWkvAPSpUo57wWEXJgqdyyN2Wk/jsv9mfqKyxD/L/QSqjbnpu0A4gv6CLy+RCOk /LOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=FzCPyHJ0lS7Dsfd+Xdg3GwESQ5Yx6zOMSzk4fmDnMtg=; b=iaKPrdft98C03kl52Cmp3f5D4eZrMFS7DdO7vS2vC+PUEcOA5CnALzYZdPKZmHxDGz 4eEW5kQ9OVN6EeyNJkdfa29/sttty+e2UU9Q/GzlVrEOXyBwZUrIn+ka09TKF5dneerD C9FCv65K1L/3CnsXv66mdFthsiTrEC4zqK5Y/nFFiSeduWS4r4arImXb8rIOL17YIk2A 9ZhkOmU5YtJFL3UxTnP+4ICTx6RHmVyvwPM3CiLWy51GAkt1/A+xqwTZM2SVwNxfZoXS zks4YOxQcnyAcadZuQ2/d1jY8Bs/T6TkK/0TM+FBqXsIc5CqT+/A1cOAvad86e2H9qjE 8k9Q== X-Gm-Message-State: AOAM531QuD+SDyfMtVfp9Q7R9bKK592Vard+ZFk2QDocnrWJKW2PmEsL yjoL474lAoj7lKQlyjvZ3TfQNItScjemSRZJI18= X-Google-Smtp-Source: ABdhPJy++8IsYM3xRjYK9fse8dGjZTGN2V+jrqmx8EKC2OfiCnPWKng/p8T9PyGqipth9vKH7bjsep/UKkz2BbTEMgw= X-Received: by 2002:a05:6512:261d:: with SMTP id bt29mr2538455lfb.231.1627030615623; Fri, 23 Jul 2021 01:56:55 -0700 (PDT) In-Reply-To: Received-SPF: pass client-ip=2a00:1450:4864:20::12a; envelope-from=hongyi.zhao@gmail.com; helo=mail-lf1-x12a.google.com X-Spam_score_int: -1 X-Spam_score: -0.2 X-Spam_bar: / X-Spam_report: (-0.2 / 5.0 requ) DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham 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:132071 Archived-At: On Fri, Jul 23, 2021 at 1:55 PM Jean Louis wrote: > > * 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. Good idea. > 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. Anyway, thank you very much for your help. > (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. Thank you for recommending `maim' to me. From its official description [1], it can be seen as an improved scrot, which is the one used by me now. [1] https://github.com/naelstrof/maim > > 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. Other possible processing includes highlighting some regions with square or circle, adding some text comments, and drawing some lines or arrows, and so on. I'm not sure whether all these trivial operations can be done by the method similar to the above. Regards, Hongyi