תוכן דבר אדיר שאפשר לעשות עם צ'אט GPT - מתאים למזכירים-מנהלים

  • פותח הנושא lab
  • פורסם בתאריך
יצירת תוכן מקצועי באמצעות הבינה המלאכותית
  • הוסף לסימניות
  • #1
מזכיר אחד שאל אותי:
יש לו אלפי סריקות של תעודות זהות
והוא רוצה שיהיה לו קל לחפש
אז הוא רוצה שכל קובץ השם שלו יהיה המספר תעודת זהות
על פניו אין קיצורי דרך וצריך להושיב בן אדם שיעבור על כל קובץ ויעתיק ידני את המספר תז מהצילום לשם הקובץ
אבל אני אמרתי בא ננסה בAI
הכנסתי לGPT סריקה אחת ואמרתי לו לשנות את שם הקובץ למס תז ולמרבה ההפתעה הוא הסכים
1738169962428.png
 
  • הוסף לסימניות
  • #2
איזה חוסר אבטחה להכניס לצ'אט מספרי זהות של ילדים

אם כבר אפשר לבקש ממנו שייצור סקריפט אותו אפשר להריץ על התיקייה שישנה את שמות הקבצים
 
  • הוסף לסימניות
  • #3
איזה חוסר אבטחה להכניס לצ'אט מספרי זהות של ילדים

אם כבר אפשר לבקש ממנו שייצור סקריפט אותו אפשר להריץ על התיקייה שישנה את שמות הקבצים
מה ההבדל? בכל מקרה הקובץ על השרתים שלהם?
 
  • הוסף לסימניות
  • #4
מה הכוונה שרתים שלהם ? google doc/drive ?
יש הבדל מאד גדול!
כשאתה שם מידע רגיש תחת חשבון הגמיל שלך גוגל מתחיבים לך שהם שומרים על הפרטיות שלו
שאתה מעלה מידע לgbt אתה בעצם מעשיר את המודל והמידע שלהם ואין להם שום התחיבות לשמור על המידע הזה ולא לשתף אותו , אלא אם כן אתה משתמש ב AI שהם מתחיבים שהוא פרטי ומוגן למידע שלך Bedrock \ Copilot ועוד ....
 
  • הוסף לסימניות
  • #5
מה הכוונה שרתים שלהם ? google doc/drive ?
יש הבדל מאד גדול!
כשאתה שם מידע רגיש תחת חשבון הגמיל שלך גוגל מתחיבים לך שהם שומרים על הפרטיות שלו
שאתה מעלה מידע לgbt אתה בעצם מעשיר את המודל והמידע שלהם ואין להם שום התחיבות לשמור על המידע הזה ולא לשתף אותו , אלא אם כן אתה משתמש ב AI שהם מתחיבים שהוא פרטי ומוגן למידע שלך Bedrock \ Copilot ועוד ....
חשבתי שOpenAI מצהירים על פרטיות אחרת היו דולפים טוקנים וסיסמאות בקצב....
בכל אופן העניין הוא שצריך להשתמש רק בשירותים של חברות ששומרים על פרטיות גם אם זה לא ת"ז של ילדים
 
  • הוסף לסימניות
  • #6
לכאורה גם כאן צריך להעלות לו תמונה אחת אחרי השניה, לא?
פתרון יותר פשוט - להשתמש בפייתון , התמונות נשארות אצלך במחשב
נכון שאתה זה שצריך להקליד את התז אבל זה הרבה יותר פשוט ונח
בניתי בחצי דקה עם קלאוד
זה מה שביקשתי:
אני רוצה שתיצור לי קוד פייתון שאוכל לשנות שמות של הרבה תמונות יחד, אני יבחר כמה תמונות יחד, התמונות יהיו מוצגות ולא רק הסמל, מתחת לכל תמונה יהיה את שם הקובץ שאוכל לשנות, שלא יציג את סיומת הקובץ כך אוכל לשנות במהירות יותר את הקבצים ובסיום אוכל ללחוץ על כפתור אישור וכל השמות ישתנו
זה מה יצא:

1738183464063.png


דרישות מערכת:


  • Python 3.x
  • ספריית Pillow (PIL) - ניתן להתקין באמצעות pip install Pillow
  • tkinter (בדרך כלל מגיע מובנה עם Python)

תיאור התוכנה:

הכלי "מערכת שינוי שמות תמונות" מספק פתרון נוח וידידותי למשתמש לניהול ושמות קבצי התמונה שלכם. בעזרת ממשק גרפי אינטואיטיבי, תוכלו לבצע את הפעולות הבאות בקלות:

  • בחירת תמונות קלה: בחרו מספר תמונות בודדות או תיקיות שלמות בלחיצת כפתור.
  • שינוי שמות ידני: שנו שם של כל תמונה בנפרד באמצעות שדות טקסט נוחים.
  • שינוי שמות אוטומטי: השתמשו בתבניות שמות מותאמות אישית כדי לשנות שמות של קבוצות תמונות במהירות ובקלות (למשל, סידור מספרי, תאריכים ועוד).
  • סידור תמונות בגרירה: ארגנו את התמונות שלכם מחדש על ידי גרירה ושחרור פשוטים, כדי לקבוע את סדר השמות האוטומטי או סדר התצוגה.
  • תצוגה מקדימה: בדקו כל תמונה לפני שינוי השם כדי לוודא שאתם עובדים עם התמונה הנכונה.
  • Undo & Redo: בטלו או בצעו שוב פעולות שינוי שם וסידור בקלות, כדי לאפשר גמישות ותיקון טעויות.
  • גודל תמונות ממוזערות מתכוונן: התאימו את גודל התמונות הממוזערות המוצגות לצרכים שלכם.
  • שמירת הגדרות: ההגדרות שלכם נשמרות לשימוש עתידי, לנוחות מירבית.
 
  • הוסף לסימניות
  • #8
וואללה
זרמתי עם הנושא והוספתי OCR לקוד
עכשיו בלחיצת כפתור הוא מוסיף את התז לשם

אני עדיין בשלבי הפיתוח הוא לא תמיד מזהה את כל התעודות זהות
מצורף סרטון (העלתי גם בזיפ לחסומים..)

 

קבצים מצורפים

  • הקלטה 2025-01-30 000837.zip
    4 MB · צפיות: 32
  • הוסף לסימניות
  • #9
איך ניתן להשיג את הפיצ'ר הזה?

אם תוסיף עוד כמה אפשרויות OCR זה יהיה יעיל ומבוקש במשרדים.
לדוגמה להגדיר לפי אזור טקסט שנבחר, או לפי סוג מסמך. או לכתוב את שם המסמך בקובץ CRM.

בכל אשמח אם תוכל לכתוב איך ניתן לראות את התוכנה.
 
  • הוסף לסימניות
  • #10
הוא עדיין לא מושלם לכן לא העלתי לכאן - האמת שאין לי כח להמשיך כי אין לי צורך כרגע בכזה דבר ואין ככ זמן מיותר לשרוף על זה

אין לי בעיה להעלות את הקוד לכאן אבל כל מי שממשיך לפתח אותו מתחייב להעלות לכאן גרסאות עדכניות
שהוסיף וכן מתחייב שלא למכור את התוסף אלא שימוש חינמי בלבד...


דרישות מערכת עבור Windows:

  1. Python:
    • גרסת Python 3 ומעלה (מומלץ 3.7+)
    • התקנה של Python מתוך האתר הרשמי, כולל הוספת Python ל-PATH של המערכת.
  2. ספריות Python:
    • התקן את הספריות באמצעות pip במנהל החלונות (cmd או PowerShell)
      קוד:
      pip install pillow pytesseract

  3. Tesseract OCR:
    • הורד את Tesseract מהאתר הרשמי של Tesseract: https://github.com/UB-Mannheim/tesseract/wiki
    • התקן את Tesseract.
    • וודא כי הנתיב להתקנה של Tesseract מוגדר בקוד (בשורה pytesseract.pytesseract.tesseract_cmd). כברירת מחדל זה צריך להיות משהו כמו r'C:\Program Files\Tesseract-OCR\tesseract.exe' או נתיב שונה בהתאם למקום שבו Tesseract הותקן.
    • אם יש צורך בOCR של עברית, הורד את קובץ השפה של עברית והוסף אותו לתיקייה tessdata שנמצאת בתוך התיקייה של Tesseract.
בקיצור:

  • Python 3+ מותקן.
  • Pillow ו-pytesseract מותקנים באמצעות pip.
  • Tesseract OCR מותקן והנתיב שלו מוגדר בקוד.
  • אם יש צורך בOCR של עברית, קובץ השפה של עברית מותקן.
זהו, אם תמלא אחר הדרישות האלו, הקוד אמור לעבוד ב-Windows.


זה הקוד (מצורף גם בזיפ)

Python:
import tkinter as tk
from tkinter import filedialog, ttk, messagebox
from PIL import Image, ImageTk, ImageEnhance, ImageOps, ImageFilter  # Added ImageFilter
import os
import json
from typing import Dict, List, Tuple
import math
from collections import deque
import pytesseract
import re

class ImageRenamer:
    def __init__(self, root):
        self.root = root
        self.root.title("מערכת שינוי שמות תמונות")
        self.root.geometry("1024x768")

        # מילון לשמירת השמות החדשים ותמונות
        self.new_names: Dict[str, ttk.Entry] = {}
        self.thumbnail_size = self.load_settings().get('thumbnail_size', 150)
        self.files: List[str] = []
        self.photo_references = []
        self.dragged_widget = None
        self.drag_source_index = None

        # היסטוריית פעולות ל-Undo/Redo
        self.undo_stack = deque(maxlen=50)
        self.redo_stack = deque(maxlen=50)

        self.create_gui()
        self.create_preview_window()

    def create_preview_window(self):
        # חלון תצוגה מקדימה
        self.preview_window = tk.Toplevel(self.root)
        self.preview_window.title("תצוגה מקדימה")
        self.preview_window.geometry("800x600")
        self.preview_window.withdraw()  # הסתרת החלון בהתחלה

        self.preview_label = ttk.Label(self.preview_window)
        self.preview_label.pack(expand=True, fill=tk.BOTH)

        # כפתור סגירה
        close_btn = ttk.Button(self.preview_window, text="סגור",
                             command=lambda: self.preview_window.withdraw())
        close_btn.pack(pady=10)

    def create_gui(self):
        # מסגרת עליונה לכפתורים וכלי שליטה
        control_frame = ttk.Frame(self.root)
        control_frame.pack(fill=tk.X, padx=5, pady=5)

        # כפתורים שמאליים
        left_frame = ttk.Frame(control_frame)
        left_frame.pack(side=tk.LEFT, fill=tk.X)

        select_btn = ttk.Button(left_frame, text="בחר תמונות", command=self.select_files)
        select_btn.pack(side=tk.LEFT, padx=5)

        # שליטה בגודל התמונות הממוזערות
        ttk.Label(left_frame, text="גודל תמונות:").pack(side=tk.LEFT, padx=5)
        self.size_var = tk.StringVar(value=str(self.thumbnail_size))
        size_entry = ttk.Entry(left_frame, textvariable=self.size_var, width=5)
        size_entry.pack(side=tk.LEFT)

        update_size_btn = ttk.Button(left_frame, text="עדכן גודל",
                                   command=lambda: self.update_thumbnail_size(int(self.size_var.get())))
        update_size_btn.pack(side=tk.LEFT, padx=5)

        # מסגרת לשינוי שמות אוטומטי
        auto_rename_frame = ttk.LabelFrame(control_frame, text="שינוי שמות אוטומטי")
        auto_rename_frame.pack(side=tk.LEFT, padx=20)

        ttk.Label(auto_rename_frame, text="תבנית:").pack(side=tk.LEFT, padx=5)
        self.pattern_var = tk.StringVar(value="image_{:03d}")
        self.pattern_entry = ttk.Entry(auto_rename_frame, textvariable=self.pattern_var, width=15)
        self.pattern_entry.pack(side=tk.LEFT, padx=5)

        ttk.Button(auto_rename_frame, text="החל",
                  command=self.apply_auto_rename).pack(side=tk.LEFT, padx=5)

        # כפתור OCR לזיהוי מספר ת.ז.
        ocr_id_btn = ttk.Button(auto_rename_frame, text="OCR ת.ז.",
                                 command=self.apply_ocr_rename)
        ocr_id_btn.pack(side=tk.LEFT, padx=5)

        # כפתורי Undo/Redo
        undo_frame = ttk.Frame(control_frame)
        undo_frame.pack(side=tk.LEFT, padx=20)

        self.undo_btn = ttk.Button(undo_frame, text="בטל", command=self.undo_action)
        self.undo_btn.pack(side=tk.LEFT, padx=2)
        self.undo_btn.state(['disabled'])

        self.redo_btn = ttk.Button(undo_frame, text="בצע שוב", command=self.redo_action)
        self.redo_btn.pack(side=tk.LEFT, padx=2)
        self.redo_btn.state(['disabled'])

        # כפתור שמירה
        save_btn = ttk.Button(control_frame, text="שמור שינויים", command=self.save_changes)
        save_btn.pack(side=tk.RIGHT, padx=5)

        # מסגרת לתצוגת התמונות
        self.canvas_frame = ttk.Frame(self.root)
        self.canvas_frame.pack(fill=tk.BOTH, expand=True)

        # Canvas עם scrollbar
        self.canvas = tk.Canvas(self.canvas_frame)
        scrollbar_y = ttk.Scrollbar(self.canvas_frame, orient="vertical", command=self.canvas.yview)
        scrollbar_x = ttk.Scrollbar(self.canvas_frame, orient="horizontal", command=self.canvas.xview)

        scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
        scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)

        self.canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        # מסגרת פנימית לתוכן
        self.inner_frame = ttk.Frame(self.canvas)
        self.canvas.create_window((0, 0), window=self.inner_frame, anchor="nw")

        # הגדרת אירועי גלילה וגרירה
        self.inner_frame.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))
        self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)

        # חלון מידע
        self.status_label = ttk.Label(self.root, text="")
        self.status_label.pack(pady=5)

    def load_settings(self):
        try:
            with open('image_renamer_settings.json', 'r') as f:
                return json.load(f)
        except:
            return {}

    def save_settings(self):
        settings = {
            'thumbnail_size': self.thumbnail_size,
            'pattern': self.pattern_var.get()
        }
        try:
            with open('image_renamer_settings.json', 'w') as f:
                json.dump(settings, f)
        except Exception as e:
            print(f"Error saving settings: {e}")

    def show_preview(self, file_path):
        try:
            # טעינת התמונה המקורית
            img = Image.open(file_path)

            # חישוב יחס גודל חדש לשמירה על פרופורציות
            display_size = (780, 580)  # גודל מקסימלי לתצוגה
            img.thumbnail(display_size, Image.Resampling.LANCZOS)

            # המרה ל-PhotoImage
            photo = ImageTk.PhotoImage(img)

            # עדכון התווית
            self.preview_label.configure(image=photo)
            self.preview_label.image = photo

            # הצגת החלון
            self.preview_window.deiconify()
            self.preview_window.lift()

        except Exception as e:
            messagebox.showerror("שגיאה", f"שגיאה בטעינת התמונה: {str(e)}")

    def apply_auto_rename(self):
        if not self.files:
            return

        pattern = self.pattern_var.get()
        if not pattern:
            messagebox.showerror("שגיאה", "נא להזין תבנית שם")
            return

        # שמירת מצב נוכחי להיסטוריה
        old_names = {path: entry.get() for path, entry in self.new_names.items()}

        try:
            # שינוי שמות לפי התבנית
            for i, file_path in enumerate(self.files):
                new_name = pattern.format(i + 1)  # מתחיל מ-1
                self.new_names[file_path].delete(0, tk.END)
                self.new_names[file_path].insert(0, new_name)

            # הוספת הפעולה להיסטוריה
            self.add_to_history('rename', old_names)

        except Exception as e:
            messagebox.showerror("שגיאה", f"שגיאה בשינוי שמות: {str(e)}")

    def add_to_history(self, action_type, old_state):
        if action_type == 'remove':
            self.undo_stack.append(('remove', old_state)) # old_state is a tuple of (files_list, new_names_dict)
        else:
            self.undo_stack.append((action_type, old_state))
        self.redo_stack.clear()
        self.update_undo_redo_buttons()

    def undo_action(self):
        if not self.undo_stack:
            return

        action_type, old_state = self.undo_stack.pop()

        # שמירת המצב הנוכחי ל-redo
        current_state = (self.files.copy(), {path: entry.get() for path, entry in self.new_names.items()})
        self.redo_stack.append((action_type, current_state))

        if action_type == 'remove':
            self.files, self.new_names = old_state
            self.display_images() # Refresh display after undo remove
        elif action_type == 'reorder':
            self.files = old_state
            self.display_images()
        elif action_type in ['rename', 'ocr_rename', 'save']:
            for path, old_name in old_state.items():
                if path in self.new_names:
                    self.new_names[path].delete(0, tk.END)
                    self.new_names[path].insert(0, old_name)

        self.update_undo_redo_buttons()

    def redo_action(self):
        if not self.redo_stack:
            return

        action_type, old_state = self.redo_stack.pop()

        # שמירת המצב הנוכחי ל-undo
        current_state = (self.files.copy(), {path: entry.get() for path, entry in self.new_names.items()})
        self.undo_stack.append((action_type, current_state))

        if action_type == 'remove':
            self.files, self.new_names = old_state
            self.display_images() # Refresh display after redo remove
        elif action_type == 'reorder':
            self.files = old_state
            self.display_images()
        elif action_type in ['rename', 'ocr_rename', 'save']:
            for path, new_name in old_state.items():
                if path in self.new_names:
                    self.new_names[path].delete(0, tk.END)
                    self.new_names[path].insert(0, new_name)

        self.update_undo_redo_buttons()

    def update_undo_redo_buttons(self):
        self.undo_btn.state(['!disabled'] if self.undo_stack else ['disabled'])
        self.redo_btn.state(['!disabled'] if self.redo_stack else ['disabled'])

    def setup_drag_and_drop(self, frame, file_path, index):
        frame.bind("<Button-1>", lambda e: self.start_drag(e, frame, index))
        frame.bind("<B1-Motion>", self.drag)
        frame.bind("<ButtonRelease-1>", self.drop)

    def start_drag(self, event, widget, index):
        self.dragged_widget = widget
        self.drag_source_index = index

    def drag(self, event):
        if not self.dragged_widget:
            return
        pass

    def drop(self, event):
        if not self.dragged_widget or self.drag_source_index is None:
            return

        x = event.x_root - self.root.winfo_rootx()
        y = event.y_root - self.root.winfo_rooty()

        target_index = self.find_drop_target(x, y)

        if target_index is not None and target_index != self.drag_source_index:
            old_order = self.files.copy()

            file_to_move = self.files.pop(self.drag_source_index)
            self.files.insert(target_index, file_to_move)

            self.add_to_history('reorder', old_order)

            self.display_images()

        self.dragged_widget = None
        self.drag_source_index = None

    def find_drop_target(self, x, y):
        for idx, frame in enumerate(self.inner_frame.winfo_children()):
            bbox = frame.winfo_geometry()
            x1, y1, width, height = map(int, bbox.replace('x', '+').split('+'))
            if x1 <= x <= x1 + width and y1 <= y <= y1 + height:
                return idx
        return None

    def _on_mousewheel(self, event):
        self.canvas.yview_scroll(int(-1*(event.delta/120)), "units")

    def update_thumbnail_size(self, new_size):
        if new_size < 50:
            new_size = 50
        elif new_size > 500:
            new_size = 500

        self.thumbnail_size = new_size
        self.size_var.set(str(new_size))
        self.save_settings()
        if self.files:
            self.display_images()

    def select_files(self):
        new_files = filedialog.askopenfilenames(
            title="בחר תמונות",
            filetypes=[
                ("Image files", "*.png *.jpg *.jpeg *.gif *.bmp")
            ]
        )

        if new_files:
            self.files = list(new_files)
            self.status_label.config(text=f"נבחרו {len(self.files)} תמונות")
            self.undo_stack.clear()
            self.redo_stack.clear()
            self.update_undo_redo_buttons()
            self.display_images()

    def display_images(self):
        # ניקוי תצוגה קודמת
        for widget in self.inner_frame.winfo_children():
            widget.destroy()
        self.photo_references.clear()
        self.new_names.clear()

        if not self.files:
            return

        canvas_width = self.canvas.winfo_width()
        num_columns = max(1, canvas_width // (self.thumbnail_size + 20))

        for idx, file_path in enumerate(self.files):
            row = idx // num_columns
            col = idx % num_columns

            frame = ttk.Frame(self.inner_frame)
            frame.grid(row=row, column=col, padx=10, pady=10)

            try:
                img = Image.open(file_path)
                img.thumbnail((self.thumbnail_size, self.thumbnail_size))
                photo = ImageTk.PhotoImage(img)
                self.photo_references.append(photo)

                img_button = ttk.Button(frame, image=photo,
                                      command=lambda fp=file_path: self.show_preview(fp))
                img_button.image = photo
                img_button.pack()

                filename = os.path.splitext(os.path.basename(file_path))[0]
                entry = ttk.Entry(frame, width=min(30, self.thumbnail_size // 10))
                entry.insert(0, filename)
                entry.pack(pady=5)

                file_size = os.path.getsize(file_path) / (1024 * 1024)
                size_label = ttk.Label(frame, text=f"{file_size:.1f} MB")
                size_label.pack()

                self.new_names[file_path] = entry

                self.setup_drag_and_drop(frame, file_path, idx)

                # כפתור הסרה
                remove_btn = ttk.Button(frame, text="X", width=1, command=lambda fp=file_path: self.remove_image(fp))
                remove_btn.pack(side=tk.TOP, anchor=tk.NE) # הצבה בפינה ימנית עליונה

            except Exception as e:
                messagebox.showerror("שגיאה", f"שגיאה בטעינת התמונה {file_path}: {str(e)}")

    def extract_id_number_from_image(self, image_path):
        """
        מחלץ מספר תעודת זהות (9 ספרות) מתמונה באמצעות OCR, כולל שיפור תמונה לטשטוש.
        """
        try:
            img = Image.open(image_path)

            # **עיבוד תמונה מקדים לשיפור OCR**
            img_gray = img.convert('L') # המרה לגווני אפור
            img_blur = img_gray.filter(ImageFilter.GaussianBlur(radius=1)) # טשטוש גאוסיאני קל - הוספנו טשטוש
            img_contrast = ImageEnhance.Contrast(img_blur).enhance(2.0) # הגברת קונטרסט
            img_sharp = ImageEnhance.Sharpness(img_contrast).enhance(2.0) # הגברת חדות
            img_threshold = ImageOps.autocontrast(img_sharp) # סף אדפטיבי (אוטומטי)
            # img_threshold = img_gray.point(lambda p: 0 if p < 150 else 255, '1') # סף בינארי - אפשר לנסות במקום autocontrast

            # המרת התמונה המעובדת לטקסט באמצעות OCR
            config_params = '--psm 6' # מצב פילוח עמוד 6 - בלוק טקסט בודד - הוספנו psm
            # config_params = '--psm 6 -c tessedit_char_whitelist=0123456789' # אפשרות לנסות whitelist רק ספרות (מורכב יותר)
            text = pytesseract.image_to_string(img_threshold, lang='heb+eng', config=config_params) # שימוש בתמונה המעובדת, הוספנו config

            print(f"טקסט OCR גולמי עבור {image_path}: \n{text}") # הדפסת טקסט גולמי לדיבוג - חשוב לבדוק

            # המשך זיהוי מספר ת.ז. עם הביטוי הרגולרי
            id_numbers_spaced = re.findall(r'\b([\d\s]+)\b', text) # ביטוי רגולרי - אולי כללי מדי
            if id_numbers_spaced:
                for spaced_id in id_numbers_spaced:
                    id_number = "".join(filter(str.isdigit, spaced_id))
                    if len(id_number) == 9:
                        return id_number
            return None
        except Exception as e:
            print(f"שגיאת OCR עבור {image_path}: {e}")
            return None

    def apply_ocr_rename(self):
        if not self.files:
            return

        old_names = {path: entry.get() for path, entry in self.new_names.items()}

        try:
            for file_path in self.files:
                id_number = self.extract_id_number_from_image(file_path)
                if id_number:
                    self.new_names[file_path].delete(0, tk.END)
                    self.new_names[file_path].insert(0, id_number)
                    self.status_label.config(text=f"זוהה מספר ת.ז. {id_number} עבור {os.path.basename(file_path)}")
                else:
                    self.status_label.config(text=f"לא זוהה מספר ת.ז. עבור {os.path.basename(file_path)}")
        except Exception as e:
            messagebox.showerror("שגיאה", f"שגיאה בביצוע OCR: {str(e)}")

        self.add_to_history('ocr_rename', old_names)

    def remove_image(self, file_path):
        """
        מסיר תמונה מרשימת התמונות המוצגות.
        """
        if file_path not in self.files:
            return

        # שמירת מצב נוכחי להיסטוריה
        old_state = (self.files.copy(), self.new_names.copy())
        self.add_to_history('remove', old_state)

        # הסרת הקובץ מהרשימות
        self.files.remove(file_path)
        if file_path in self.new_names:
            del self.new_names[file_path]

        self.display_images() # רענון התצוגה

    def save_changes(self):
        old_names = {path: os.path.splitext(os.path.basename(path))[0]
                    for path in self.files}

        success_count = 0
        error_count = 0

        for old_path in self.files:
            new_name = self.new_names[old_path].get().strip()
            if new_name:
                directory = os.path.dirname(old_path)
                extension = os.path.splitext(old_path)[1]
                new_path = os.path.join(directory, new_name + extension)

                try:
                    if old_path != new_path:
                        os.rename(old_path, new_path)
                        success_count += 1
                except Exception as e:
                    error_count += 1
                    messagebox.showerror("שגיאה", f"שגיאה בשינוי שם הקובץ {old_path}: {str(e)}")

        if success_count > 0:
            self.add_to_history('save', old_names)

        status = f"הושלם בהצלחה! {success_count} קבצים שונו"
        if error_count:
            status += f", {error_count} שגיאות"

        messagebox.showinfo("סיום", status)
        if success_count > 0:
            self.files = []
            self.new_names.clear()
            self.display_images()

    def on_closing(self):
        self.save_settings()
        self.root.quit()

if __name__ == "__main__":
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # נתיב Tesseract - **ודא שנכון!**
    root = tk.Tk()
    app = ImageRenamer(root)
    root.protocol("WM_DELETE_WINDOW", app.on_closing)
    root.mainloop()
 

קבצים מצורפים

  • משנה שמות לתמונות כולל OCR לתעודות זהות.zip
    KB 5.4 · צפיות: 24
  • הוסף לסימניות
  • #11
בשביל להמשיך לפתח את התוסף אתם פשוט צריכים להעתיק את הקוד ולהדביק באחד הבינות הזמינות לכן ולשאול איך ניתן עוד לפתח אותו..
או אם יש לכם רעיון חדש להוסיף לתוכנה פשוט תכתבו לו מה אתם רוצים שיהיה בו ושיוסיף את זה לקוד
אשמח שתשתפו בתוצאות
 
  • תודה
Reactions: z.w
  • הוסף לסימניות
  • #13
זה ממש חוסר אחריות,
אסור להעלות פרטים אישיים של ילדים ותלמידים (וגם לא של הוריהם)
למערכת של בינה מלאכותית.
 
  • הוסף לסימניות
  • #14
איפה אתה רואה שהקבצים כבר נמצאים בענן?
צריך לבקש קוד ואותו להריץ אופליין
מי שרוצה LLM שישמש כOCR (שמוצלח הרבה יותר ממודלי OCR וותיקים) לרוב צריך שהתמונה תשלח לשרת כל שהוא ולקבל חזרה טקסט
זה ממש חוסר אחריות,
אסור להעלות פרטים אישיים של ילדים ותלמידים (וגם לא של הוריהם)
למערכת של בינה מלאכותית.
כנ"ל להעלות לגוגל דרייב ולהגדיר כקובץ ציבור כדי שיהיה נח לשתף (בעיני ראיתי) .....
 
  • הוסף לסימניות
  • #15
מי שרוצה LLM שישמש כOCR (שמוצלח הרבה יותר ממודלי OCR וותיקים) לרוב צריך שהתמונה תשלח לשרת כל שהוא ולקבל חזרה טקסט
צריך סה"כ לחלץ מספר תעודת זהות, OCR פשוט עם רג'קס יעשה את העבודה מעולה ומהר
 
  • הוסף לסימניות
  • #16
הGPT לא סגור על עצמו
בהתחלה הוא כותב
1738698173768.png


וכשאמרתי לו נסה שוב
1738698199858.png
 
  • הוסף לסימניות
  • #17
בשום פנים ואופן לא מעלים פרטים אישיים ל ChatGPT וגם לא לבינה אחרת.
בטח ובטח כשמדובר בפרטים אישיים של אנשים אחרים
 
  • הוסף לסימניות
  • #18
תנוח דעתכם אני לא מעלה שום דבר
בין כה וכה יש הגבלה ל3 ביום
וגם אם לא ברוב הפעמים הוא לא משתף פעולה (גם לא היה מדובר בילדים)
 
נערך לאחרונה ב:
  • הוסף לסימניות
  • #19
בשום פנים ואופן לא מעלים פרטים אישיים ל ChatGPT וגם לא לבינה אחרת.
בטח ובטח כשמדובר בפרטים אישיים של אנשים אחרים
שמישהו אולי יסביר מה ההבדל בין להעלות קובץ לGemini לאחסון של אותו קובץ בגוגל דרייב?
 
  • הוסף לסימניות
  • #20
שמישהו אולי יסביר מה ההבדל בין להעלות קובץ לGemini לאחסון של אותו קובץ בגוגל דרייב?
אכן היחס שלי לב"מ ולדרייב הוא די דומה, וספציפית בנושא הזה הוא ממש זהה
 

פרוגבוט

תוכן שיווקי
פרסומת

פוסטים חדשים שאולי לא קראת....

הצטרפות לניוזלטר

איזה כיף שהצטרפתם לניוזלטר שלנו!

מעכשיו, תהיו הראשונים לקבל את כל העדכונים, החדשות, ההפתעות בלעדיות, והתכנים הכי חמים שלנו בפרוג!

לוח מודעות

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק כה

אלְדָוִד אֵלֶיךָ יי נַפְשִׁי אֶשָּׂא:באֱלֹהַי בְּךָ בָטַחְתִּי אַל אֵבוֹשָׁה אַל יַעַלְצוּ אֹיְבַי לִי:גגַּם כָּל קוֶֹיךָ לֹא יֵבֹשׁוּ יֵבֹשׁוּ הַבּוֹגְדִים רֵיקָם:דדְּרָכֶיךָ יי הוֹדִיעֵנִי אֹרְחוֹתֶיךָ לַמְּדֵנִי:ההַדְרִיכֵנִי בַאֲמִתֶּךָ וְלַמְּדֵנִי כִּי אַתָּה אֱלֹהֵי יִשְׁעִי אוֹתְךָ קִוִּיתִי כָּל הַיּוֹם:וזְכֹר רַחֲמֶיךָ יי וַחֲסָדֶיךָ כִּי מֵעוֹלָם הֵמָּה:זחַטֹּאות נְעוּרַי וּפְשָׁעַי אַל תִּזְכֹּר כְּחַסְדְּךָ זְכָר לִי אַתָּה לְמַעַן טוּבְךָ יי:חטוֹב וְיָשָׁר יי עַל כֵּן יוֹרֶה חַטָּאִים בַּדָּרֶךְ:טיַדְרֵךְ עֲנָוִים בַּמִּשְׁפָּט וִילַמֵּד עֲנָוִים דַּרְכּוֹ:יכָּל אָרְחוֹת יי חֶסֶד וֶאֱמֶת לְנֹצְרֵי בְרִיתוֹ וְעֵדֹתָיו:יאלְמַעַן שִׁמְךָ יי וְסָלַחְתָּ לַעֲוֹנִי כִּי רַב הוּא:יבמִי זֶה הָאִישׁ יְרֵא יי יוֹרֶנּוּ בְּדֶרֶךְ יִבְחָר:יגנַפְשׁוֹ בְּטוֹב תָּלִין וְזַרְעוֹ יִירַשׁ אָרֶץ:ידסוֹד יי לִירֵאָיו וּבְרִיתוֹ לְהוֹדִיעָם:טועֵינַי תָּמִיד אֶל יי כִּי הוּא יוֹצִיא מֵרֶשֶׁת רַגְלָי:טזפְּנֵה אֵלַי וְחָנֵּנִי כִּי יָחִיד וְעָנִי אָנִי:יזצָרוֹת לְבָבִי הִרְחִיבוּ מִמְּצוּקוֹתַי הוֹצִיאֵנִי:יחרְאֵה עָנְיִי וַעֲמָלִי וְשָׂא לְכָל חַטֹּאותָי:יטרְאֵה אוֹיְבַי כִּי רָבּוּ וְשִׂנְאַת חָמָס שְׂנֵאוּנִי:כשָׁמְרָה נַפְשִׁי וְהַצִּילֵנִי אַל אֵבוֹשׁ כִּי חָסִיתִי בָךְ:כאתֹּם וָיֹשֶׁר יִצְּרוּנִי כִּי קִוִּיתִיךָ:כבפְּדֵה אֱלֹהִים אֶת יִשְׂרָאֵל מִכֹּל צָרוֹתָיו:
נקרא  2  פעמים
למעלה