Fastshot
Fastshot is an open-source Python-based screenshot tool for Windows, inspired by Snipaste. It provides a versatile and user-friendly interface for capturing and annotating screenshots, making it ideal for research, reading papers, writing code, and various comparison and demonstration scenarios.
Features
- Always on Top: Screenshots stay on top, allowing easy comparison.
- Smooth Zoom and Drag: Effortlessly zoom and drag screenshots.
- Annotation Tools: Hand-drawing and text mode for annotations.
- Clipboard Export: Easily export screenshots to the clipboard.
- OCR Integration: Extract text from images using the built-in OCR plugin powered by PaddleOCR.
Installation
You can install Fastshot from PyPI:
pip install fastshot
Usage
Once installed, you can start Fastshot from the command line:
fastshot
Hotkeys
Ctrl+F1
: Activate screen capturing mode.
Ctrl+P
: Activate paint mode.
Ctrl+T
: Activate text mode.
Esc
: Exit the current mode.
❌ Close
: Close the current window.
💾 Save As...
: Save the current screenshot.
🖌️ Paint
: Activate paint mode.
↩️ Undo
: Undo the last action.
🚪 Exit Edit
: Exit paint or text mode.
📋 Copy
: Copy the current screenshot to the clipboard.
🔤 Text
: Activate text mode.
🔍 OCR: Perform OCR on the current screenshot and copy the result to the clipboard.
Plugin Development
Fastshot supports a plugin mechanism that allows developers to extend its functionality. Here is a brief description of how to develop a plugin:
-
Create a Plugin Class: Your plugin should be a Python class with the desired functionality. For example, an OCR plugin might look like this:
from paddleocr import PaddleOCR
from PIL import Image
import win32clipboard
import tkinter as tk
class PluginOCR:
def __init__(self):
self.ocr_engine = PaddleOCR(use_angle_cls=True, lang='en')
def ocr(self, image):
result = self.ocr_engine.ocr(image, cls=True)
ocr_text = "\n".join([line[1][0] for res in result for line in res])
self.copy_to_clipboard(ocr_text)
return ocr_text
def copy_to_clipboard(self, text):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
def show_message(self, message, parent):
label = tk.Label(parent, text=message, bg="yellow", fg="black", font=("Helvetica", 10))
label.pack(side="bottom", fill="x")
parent.after(3000, label.destroy)
-
Register the Plugin: In the SnipasteApp
class, you can register your plugin by adding it to the plugin list.
class SnipasteApp:
def load_plugins(self):
plugin_modules = ['fastshot.plugin_ocr']
for module_name in plugin_modules:
module = importlib.import_module(module_name)
plugin_class = getattr(module, 'PluginOCR')
self.plugins[module_name] = plugin_class()
-
Invoke the Plugin: You can invoke the plugin from your application code, such as from a menu item.
def ocr(self):
plugin = self.app.plugins.get('fastshot.plugin_ocr')
if plugin:
img_path = 'temp.png'
self.img_label.zoomed_image.save(img_path)
result = plugin.ocr(img_path)
plugin.show_message("OCR result updated in clipboard", self.img_window)
By following these steps, you can create and integrate custom plugins to extend the functionality of Fastshot.
Development
Setting Up the Development Environment
- Clone the repository:
git clone https://github.com/yourusername/fastshot.git
cd fastshot
- Install the dependencies:
pip install -r requirements.txt
Running Tests
You can run the tests using:
pytest tests/
Contributing
We welcome contributions! Please read our Contributing Guidelines for more details.
License
This project is licensed under the Apache License - see the LICENSE file for details.