דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
מתמחים טופ
  1. דף הבית
  2. מחשבים וטכנולוגיה
  3. עזרה הדדית - מחשבים וטכנולוגיה
  4. להורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥

להורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥

מתוזמן נעוץ נעול הועבר עזרה הדדית - מחשבים וטכנולוגיה
26 פוסטים 14 כותבים 680 צפיות 20 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A AVIVI

    בס"ד

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

    תופס תמורתו

    כרגיל כל דבר טוב מתחיל כי נמאס מה שהיה עד עכשיו (מי הזיז את ה(ג)בינה שלי?)

    בס"ד עלה בדעתי ליצור תוכנה להמרת קבצים ע"י הגבינה המלאכותית
    ובמיוחד להקטנת קבצים (שם החל הרעיון... נמאס לי להעלות חמש תמונות למייל במשך שעה רק בגלל שהמצלמה שלי טובה ב"ה...)
    תמיד יש לנו את הוידאו ששוקל טון ואת התמונה של הנוף ששוקלת 15 מ"ב ואת השיר שתופס הרבה מקום
    לשם כך ולעוד דברים נוספים נועד תופס תמורתו
    התוכנה להמרת קבצים בשניות שבע"ה תקל לנו מעט את החיים
    התוכנה כרגע ממירה וידאו אודיו ותמונה
    פותחים את התוכנה, בוחרים את הקובץ והיפ הופ הקובץ נחתך למחצה שליש ורביע לפי בחירתכם!
    הקבצים נשמרים בתקייה חדשה בשם 'קבצים_שהומרו' או בכל שפה אחרת שבחרתם כשפת התוכנה
    התוכנה תומכת בפורמטים המצויים
    התוכנה תומכת גם בהמרת תמונה ל- pdf ובהמרת וידאו לקובץ gif

    הערה חשובה לגבי הוידאו: כרגע לוקח קצת הרבה זמן לתוכנה להמיר קבצי וידאו אולם התוצאה שווה ככל שבדקתי!
    המרתי איתה קובץ וידאו במשקל 67 מ"ב ולאחר ההמרה (כ-5 דק' מעבד i5) התקבל קובץ במשקל 18.7 מ"ב ללא פגיעה באיכות הנראית לעין!!!
    רק ההמרה לקחה לי הרבה מהמעבד אז שימו לב! בגרסה הבאה אשתדל שתהיה יותר הגבלה במעבד בע"ה

    התוכנה קצת בוסרית בע"ה אני עובד לשפרה ולשכללה עדכונים יובאו כאן בהמשך

    להורדה👇
    כ"ח אייר - גירסה חדשה 1.7
    להוריד כוכביות מהקישור

    TofesTmurato1.7v

    • תיקון באג ותמיכה בהמרה לגרסאות שונות
    • שמירת הגדרות משתמש
    • הוספת מצב יום/לילה
    • שיפור התרגום והוספת שפה😉
    • לא תוקן עדיין הגבלת מעבד

    גרסאות קודמות בספויילר

    TofesTmurato 1v

    קוד פתוח למעוניינים


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

    # -*- coding: utf-8 -*-
    import sys, os, threading, json, tkinter as tk
    from tkinter import filedialog, messagebox
    from PIL import Image
    import customtkinter as ctk
    
    try:
        from moviepy.editor import VideoFileClip, AudioFileClip
    except Exception:
        print("Missing moviepy. Install with: pip install moviepy")
        sys.exit(1)
    
    def resource_path(relative_path):
        try:
            base_path = sys._MEIPASS
        except Exception:
            base_path = os.path.abspath(".")
        return os.path.join(base_path, relative_path)
    
    SETTINGS_FILE = os.path.join(os.getenv('APPDATA', os.path.expanduser('~')), 'tmurato_settings.json')
    
    MEDIA_TYPES = {
        'Video': ['MP4', 'GIF', 'MOV', 'MKV', 'WEBM', 'AVI'],
        'Audio': ['MP3', 'WAV', 'M4A', 'FLAC', 'AAC'],
        'Image': ['JPG', 'JPEG', 'PNG', 'WEBP', 'PDF', 'ICO', 'BMP']
    }
    
    TRANSLATIONS = {
        'עברית': {
            'title': 'תופס תמורתו - ממיר מקצועי', 'select': 'קבצים בחר', 'convert': 'הכל המר',
            'low': 'נמוכה', 'med': 'בינונית', 'high': 'גבוהה', 'original': 'מקור',
            'files_sel': 'נבחרו {} קבצים', 'done': '!בסייעתא דשמייא ההמרה הסתיימה בהצלחה', 
            'type': ':הקובץ סוג', 'fmt': ':פורמט', 'out_folder': 'קבצים שהומרו'
        },
        'English': {
            'title': 'Tofes Tmurato - Converter', 'select': 'Select Files', 'convert': 'Convert All',
            'low': 'Low', 'med': 'Med', 'high': 'High', 'original': 'Original',
            'files_sel': '{} files selected', 'done': 'Done!', 
            'type': 'Type:', 'fmt': 'Format:', 'out_folder': 'Converted files'
        },
        'יידיש': {
            'title': 'תופס תמורתו - מעדיאַ קאָנוערטער', 'select': 'קלייַבן טעקעס', 'convert': 'קאָנווערט אַלץ',
            'low': 'נידעריק', 'med': 'מיטל', 'high': 'הויך', 'original': 'מקור',
            'files_sel': '{} טעקעס אויסגעקליבן', 'done': '!בסייעתא דשמייא געענדיקט הצלחה', 
            'type': 'טיפּ', 'fmt': 'פֿאָרמאַט', 'out_folder': 'קאָנווערטירטע טעקעס'
        },
        'ארמית': {
            'title': 'תופס תמורתו - מחלף זמניא', 'select': 'מניינא גבי', 'convert': 'כולא חלף',
            'low': 'זוטא', 'med': 'ממוצע', 'high': 'רבא', 'original': 'עיקרא',
            'files_sel': 'גבייתא {} מניינין', 'done': '!בסייעתא דשמייא חילוף זמניא אשתלם שפיר', 
            'type': ':זניא', 'fmt': ':טופסא', 'out_folder': 'מניינין דאשתני'
        }
    }
    
    class ConverterApp(ctk.CTk):
        def __init__(self):
            super().__init__()
            self.file_paths = []
            self.settings = self.load_settings()
            
            icon_path = resource_path("icon.ico")
            if os.path.exists(icon_path):
                self.iconbitmap(icon_path)
                self.after(200, lambda: self.iconbitmap(icon_path))
    
            saved_lang = self.settings.get('lang', 'עברית')
            self.lang = saved_lang if saved_lang in TRANSLATIONS else 'עברית'
            
            self.setup_ui()
            self.apply_saved_settings()
    
        def load_settings(self):
            if os.path.exists(SETTINGS_FILE):
                try:
                    with open(SETTINGS_FILE, 'r') as f: return json.load(f)
                except: pass
            return {'lang': 'עברית'}
    
        def save_settings(self):
            self.settings.update({
                'lang': self.lang, 'quality': self.seg_quality.get(), 
                'mtype': self.opt_type.get(), 'fmt': self.opt_fmt.get(), 
                'theme': ctk.get_appearance_mode()
            })
            with open(SETTINGS_FILE, 'w') as f: json.dump(self.settings, f)
    
        def apply_saved_settings(self):
            self.change_lang(self.lang)
            self.opt_type.set(self.settings.get('mtype', 'Video'))
            self.update_formats(self.opt_type.get())
            self.opt_fmt.set(self.settings.get('fmt', 'MP4'))
            if 'theme' in self.settings: ctk.set_appearance_mode(self.settings['theme'])
    
        def setup_ui(self):
            self.geometry("450x650")
            self.title("Tofes Tmurato 1.7")
            
            self.header = ctk.CTkFrame(self, fg_color="transparent")
            self.header.pack(pady=10, fill="x", padx=20)
            
            self.theme_btn = ctk.CTkButton(self.header, text="🌓", width=40, command=self.toggle_theme)
            self.theme_btn.pack(side="left")
            
            self.lang_menu = ctk.CTkOptionMenu(self.header, values=list(TRANSLATIONS.keys()), command=self.change_lang, width=100)
            self.lang_menu.pack(side="right")
    
            self.lbl_title = ctk.CTkLabel(self, text="", font=("Arial", 22, "bold"))
            self.lbl_title.pack(pady=10)
    
            self.btn_select = ctk.CTkButton(self, text="", command=self.select_files)
            self.btn_select.pack(pady=10)
    
            self.lbl_count = ctk.CTkLabel(self, text="", font=("Arial", 14))
            self.lbl_count.pack(pady=5)
    
            self.sett_frame = ctk.CTkFrame(self)
            self.sett_frame.pack(pady=10, padx=30, fill="both")
    
            self.lbl_type = ctk.CTkLabel(self.sett_frame, text="")
            self.lbl_type.pack()
            self.opt_type = ctk.CTkOptionMenu(self.sett_frame, values=list(MEDIA_TYPES.keys()), command=self.update_formats)
            self.opt_type.pack(pady=5)
    
            self.lbl_fmt = ctk.CTkLabel(self.sett_frame, text="")
            self.lbl_fmt.pack()
            self.opt_fmt = ctk.CTkOptionMenu(self.sett_frame, values=[])
            self.opt_fmt.pack(pady=5)
    
            self.seg_quality = ctk.CTkSegmentedButton(self.sett_frame)
            self.seg_quality.pack(pady=20, padx=10, fill="x")
    
            self.progress_bar = ctk.CTkProgressBar(self)
            self.progress_bar.pack(pady=10, padx=50, fill="x")
            self.progress_bar.set(0)
    
            self.btn_convert = ctk.CTkButton(self, text="", fg_color="#28a745", command=self.start_conversion, height=45)
            self.btn_convert.pack(pady=20)
    
        def toggle_theme(self):
            new_mode = "light" if ctk.get_appearance_mode() == "Dark" else "dark"
            ctk.set_appearance_mode(new_mode)
            self.save_settings()
    
        def change_lang(self, v):
            self.lang = v
            t = TRANSLATIONS[v]
            self.lbl_title.configure(text=t['title'])
            self.btn_select.configure(text=t['select'])
            self.lbl_type.configure(text=t['type'])
            self.lbl_fmt.configure(text=t['fmt'])
            self.btn_convert.configure(text=t['convert'])
            
            q_map = {"low": t['low'], "med": t['med'], "high": t['high'], "original": t['original']}
            self.seg_quality.configure(values=list(q_map.values()))
            self.seg_quality.set(t['original'])
            
            self.update_count_label()
            self.save_settings()
    
        def update_count_label(self):
            t = TRANSLATIONS[self.lang]
            self.lbl_count.configure(text=t['files_sel'].format(len(self.file_paths)))
    
        def update_formats(self, mtype):
            self.opt_fmt.configure(values=MEDIA_TYPES[mtype])
            self.opt_fmt.set(MEDIA_TYPES[mtype][0])
            self.save_settings()
    
        def select_files(self):
            paths = filedialog.askopenfilenames()
            if paths:
                self.file_paths = list(paths)
                self.update_count_label()
                
                ext = os.path.splitext(paths[0])[1][1:].upper()
                for mtype, exts in MEDIA_TYPES.items():
                    if ext in exts or (ext == 'JPG' and 'JPEG' in exts):
                        self.opt_type.set(mtype)
                        self.update_formats(mtype)
                        break
    
        def start_conversion(self):
            if not self.file_paths: return
            self.save_settings()
            self.btn_convert.configure(state="disabled")
            threading.Thread(target=self.run_process, daemon=True).start()
    
        def run_process(self):
            for i, path in enumerate(self.file_paths):
                self.convert_logic(path)
                self.progress_bar.set((i + 1) / len(self.file_paths))
            self.btn_convert.configure(state="normal")
            self.after(0, lambda: messagebox.showinfo("V", TRANSLATIONS[self.lang]['done']))
    
        def convert_logic(self, in_p):
            ext = self.opt_fmt.get().lower()
            mtype = self.opt_type.get()
            
            source_dir = os.path.dirname(in_p)
            folder_name = TRANSLATIONS[self.lang]['out_folder']
            target_dir = os.path.join(source_dir, folder_name)
            
            if not os.path.exists(target_dir):
                os.makedirs(target_dir)
                
            out_p = os.path.join(target_dir, f"{os.path.splitext(os.path.basename(in_p))[0]}.{ext}")
            
            # זיהוי רמת האיכות שנבחרה
            t = TRANSLATIONS[self.lang]
            q_val = self.seg_quality.get()
            q_key = next((k for k in ['low', 'med', 'high', 'original'] if t[k] == q_val), 'original')
            
            # הגדרות פרמטרים לפי רמה
            q_cfg = {
                'low':      {'img': 30, 'vid': '600k',  'aud': '64k'},
                'med':      {'img': 60, 'vid': '1500k', 'aud': '128k'},
                'high':     {'img': 85, 'vid': '4000k', 'aud': '256k'},
                'original': {'img': 95, 'vid': None,    'aud': None}
            }[q_key]
    
            try:
                if mtype == 'Image':
                    with Image.open(in_p) as img:
                        if ext in ['jpg', 'jpeg'] and img.mode in ("RGBA", "P"):
                            img = img.convert("RGB")
                        if ext == 'pdf': img.convert("RGB").save(out_p, "PDF")
                        else: img.save(out_p, quality=q_cfg['img'], optimize=True)
                elif mtype == 'Video':
                    with VideoFileClip(in_p) as clip:
                        params = {"codec": "libx264", "logger": None}
                        if q_cfg['vid']: params["bitrate"] = q_cfg['vid']
                        clip.write_videofile(out_p, **params)
                elif mtype == 'Audio':
                    with AudioFileClip(in_p) as clip:
                        params = {"logger": None}
                        if q_cfg['aud']: params["bitrate"] = q_cfg['aud']
                        clip.write_audiofile(out_p, **params)
            except Exception as e: print(f"Error: {e}")
    
    if __name__ == "__main__":
        app = ConverterApp()
        app.mainloop()
    

    צילום מסך

    468d810c-a457-4c4d-bff6-df3eacb0cc60-image.png


    נ.ב. שימו לב לפני הורדת התוכנה אם אתם שולחים תמונות להדפסה וכו' נא לא להשתמש בתוכנה בד"כ זה מוריד באיכות שלשיתוף תמונות במסך הביתי זה לא פוגע אבל בהדפסה זה פוגע לפעמים

    וכמובן כמו תמיד אם יש לכם הערות לשיפור ושידרוג או שיש לכם ידע בתכנות ואתם רוצים לשפר אשמח לשמוע


    תוכנות נוספות
    להורדה "טמו וידאו אוּףף" תוסף למשתמשי נטפרי להפסקת הפעלת וידאו תצוגה מקדימה בטמו

    תוכנה קטנה לשליטה בתוכנות מסך מלא וסגירה בכח

    מ מנותק
    מ מנותק
    מיני האקר
    כתב נערך לאחרונה על ידי
    #2

    @AVIVI
    כמה זמן לוקח לזה להקטין תמונה, נגיד?

    A תגובה 1 תגובה אחרונה
    0
    • מ מיני האקר

      @AVIVI
      כמה זמן לוקח לזה להקטין תמונה, נגיד?

      A מנותק
      A מנותק
      AVIVI
      כתב נערך לאחרונה על ידי AVIVI
      #3

      @מיני-האקר פחות משנייה
      ללא הגזמה

      בעזרת השם נעשה ונצליח....

      תגובה 1 תגובה אחרונה
      2
      • A AVIVI

        בס"ד

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

        תופס תמורתו

        כרגיל כל דבר טוב מתחיל כי נמאס מה שהיה עד עכשיו (מי הזיז את ה(ג)בינה שלי?)

        בס"ד עלה בדעתי ליצור תוכנה להמרת קבצים ע"י הגבינה המלאכותית
        ובמיוחד להקטנת קבצים (שם החל הרעיון... נמאס לי להעלות חמש תמונות למייל במשך שעה רק בגלל שהמצלמה שלי טובה ב"ה...)
        תמיד יש לנו את הוידאו ששוקל טון ואת התמונה של הנוף ששוקלת 15 מ"ב ואת השיר שתופס הרבה מקום
        לשם כך ולעוד דברים נוספים נועד תופס תמורתו
        התוכנה להמרת קבצים בשניות שבע"ה תקל לנו מעט את החיים
        התוכנה כרגע ממירה וידאו אודיו ותמונה
        פותחים את התוכנה, בוחרים את הקובץ והיפ הופ הקובץ נחתך למחצה שליש ורביע לפי בחירתכם!
        הקבצים נשמרים בתקייה חדשה בשם 'קבצים_שהומרו' או בכל שפה אחרת שבחרתם כשפת התוכנה
        התוכנה תומכת בפורמטים המצויים
        התוכנה תומכת גם בהמרת תמונה ל- pdf ובהמרת וידאו לקובץ gif

        הערה חשובה לגבי הוידאו: כרגע לוקח קצת הרבה זמן לתוכנה להמיר קבצי וידאו אולם התוצאה שווה ככל שבדקתי!
        המרתי איתה קובץ וידאו במשקל 67 מ"ב ולאחר ההמרה (כ-5 דק' מעבד i5) התקבל קובץ במשקל 18.7 מ"ב ללא פגיעה באיכות הנראית לעין!!!
        רק ההמרה לקחה לי הרבה מהמעבד אז שימו לב! בגרסה הבאה אשתדל שתהיה יותר הגבלה במעבד בע"ה

        התוכנה קצת בוסרית בע"ה אני עובד לשפרה ולשכללה עדכונים יובאו כאן בהמשך

        להורדה👇
        כ"ח אייר - גירסה חדשה 1.7
        להוריד כוכביות מהקישור

        TofesTmurato1.7v

        • תיקון באג ותמיכה בהמרה לגרסאות שונות
        • שמירת הגדרות משתמש
        • הוספת מצב יום/לילה
        • שיפור התרגום והוספת שפה😉
        • לא תוקן עדיין הגבלת מעבד

        גרסאות קודמות בספויילר

        TofesTmurato 1v

        קוד פתוח למעוניינים


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

        # -*- coding: utf-8 -*-
        import sys, os, threading, json, tkinter as tk
        from tkinter import filedialog, messagebox
        from PIL import Image
        import customtkinter as ctk
        
        try:
            from moviepy.editor import VideoFileClip, AudioFileClip
        except Exception:
            print("Missing moviepy. Install with: pip install moviepy")
            sys.exit(1)
        
        def resource_path(relative_path):
            try:
                base_path = sys._MEIPASS
            except Exception:
                base_path = os.path.abspath(".")
            return os.path.join(base_path, relative_path)
        
        SETTINGS_FILE = os.path.join(os.getenv('APPDATA', os.path.expanduser('~')), 'tmurato_settings.json')
        
        MEDIA_TYPES = {
            'Video': ['MP4', 'GIF', 'MOV', 'MKV', 'WEBM', 'AVI'],
            'Audio': ['MP3', 'WAV', 'M4A', 'FLAC', 'AAC'],
            'Image': ['JPG', 'JPEG', 'PNG', 'WEBP', 'PDF', 'ICO', 'BMP']
        }
        
        TRANSLATIONS = {
            'עברית': {
                'title': 'תופס תמורתו - ממיר מקצועי', 'select': 'קבצים בחר', 'convert': 'הכל המר',
                'low': 'נמוכה', 'med': 'בינונית', 'high': 'גבוהה', 'original': 'מקור',
                'files_sel': 'נבחרו {} קבצים', 'done': '!בסייעתא דשמייא ההמרה הסתיימה בהצלחה', 
                'type': ':הקובץ סוג', 'fmt': ':פורמט', 'out_folder': 'קבצים שהומרו'
            },
            'English': {
                'title': 'Tofes Tmurato - Converter', 'select': 'Select Files', 'convert': 'Convert All',
                'low': 'Low', 'med': 'Med', 'high': 'High', 'original': 'Original',
                'files_sel': '{} files selected', 'done': 'Done!', 
                'type': 'Type:', 'fmt': 'Format:', 'out_folder': 'Converted files'
            },
            'יידיש': {
                'title': 'תופס תמורתו - מעדיאַ קאָנוערטער', 'select': 'קלייַבן טעקעס', 'convert': 'קאָנווערט אַלץ',
                'low': 'נידעריק', 'med': 'מיטל', 'high': 'הויך', 'original': 'מקור',
                'files_sel': '{} טעקעס אויסגעקליבן', 'done': '!בסייעתא דשמייא געענדיקט הצלחה', 
                'type': 'טיפּ', 'fmt': 'פֿאָרמאַט', 'out_folder': 'קאָנווערטירטע טעקעס'
            },
            'ארמית': {
                'title': 'תופס תמורתו - מחלף זמניא', 'select': 'מניינא גבי', 'convert': 'כולא חלף',
                'low': 'זוטא', 'med': 'ממוצע', 'high': 'רבא', 'original': 'עיקרא',
                'files_sel': 'גבייתא {} מניינין', 'done': '!בסייעתא דשמייא חילוף זמניא אשתלם שפיר', 
                'type': ':זניא', 'fmt': ':טופסא', 'out_folder': 'מניינין דאשתני'
            }
        }
        
        class ConverterApp(ctk.CTk):
            def __init__(self):
                super().__init__()
                self.file_paths = []
                self.settings = self.load_settings()
                
                icon_path = resource_path("icon.ico")
                if os.path.exists(icon_path):
                    self.iconbitmap(icon_path)
                    self.after(200, lambda: self.iconbitmap(icon_path))
        
                saved_lang = self.settings.get('lang', 'עברית')
                self.lang = saved_lang if saved_lang in TRANSLATIONS else 'עברית'
                
                self.setup_ui()
                self.apply_saved_settings()
        
            def load_settings(self):
                if os.path.exists(SETTINGS_FILE):
                    try:
                        with open(SETTINGS_FILE, 'r') as f: return json.load(f)
                    except: pass
                return {'lang': 'עברית'}
        
            def save_settings(self):
                self.settings.update({
                    'lang': self.lang, 'quality': self.seg_quality.get(), 
                    'mtype': self.opt_type.get(), 'fmt': self.opt_fmt.get(), 
                    'theme': ctk.get_appearance_mode()
                })
                with open(SETTINGS_FILE, 'w') as f: json.dump(self.settings, f)
        
            def apply_saved_settings(self):
                self.change_lang(self.lang)
                self.opt_type.set(self.settings.get('mtype', 'Video'))
                self.update_formats(self.opt_type.get())
                self.opt_fmt.set(self.settings.get('fmt', 'MP4'))
                if 'theme' in self.settings: ctk.set_appearance_mode(self.settings['theme'])
        
            def setup_ui(self):
                self.geometry("450x650")
                self.title("Tofes Tmurato 1.7")
                
                self.header = ctk.CTkFrame(self, fg_color="transparent")
                self.header.pack(pady=10, fill="x", padx=20)
                
                self.theme_btn = ctk.CTkButton(self.header, text="🌓", width=40, command=self.toggle_theme)
                self.theme_btn.pack(side="left")
                
                self.lang_menu = ctk.CTkOptionMenu(self.header, values=list(TRANSLATIONS.keys()), command=self.change_lang, width=100)
                self.lang_menu.pack(side="right")
        
                self.lbl_title = ctk.CTkLabel(self, text="", font=("Arial", 22, "bold"))
                self.lbl_title.pack(pady=10)
        
                self.btn_select = ctk.CTkButton(self, text="", command=self.select_files)
                self.btn_select.pack(pady=10)
        
                self.lbl_count = ctk.CTkLabel(self, text="", font=("Arial", 14))
                self.lbl_count.pack(pady=5)
        
                self.sett_frame = ctk.CTkFrame(self)
                self.sett_frame.pack(pady=10, padx=30, fill="both")
        
                self.lbl_type = ctk.CTkLabel(self.sett_frame, text="")
                self.lbl_type.pack()
                self.opt_type = ctk.CTkOptionMenu(self.sett_frame, values=list(MEDIA_TYPES.keys()), command=self.update_formats)
                self.opt_type.pack(pady=5)
        
                self.lbl_fmt = ctk.CTkLabel(self.sett_frame, text="")
                self.lbl_fmt.pack()
                self.opt_fmt = ctk.CTkOptionMenu(self.sett_frame, values=[])
                self.opt_fmt.pack(pady=5)
        
                self.seg_quality = ctk.CTkSegmentedButton(self.sett_frame)
                self.seg_quality.pack(pady=20, padx=10, fill="x")
        
                self.progress_bar = ctk.CTkProgressBar(self)
                self.progress_bar.pack(pady=10, padx=50, fill="x")
                self.progress_bar.set(0)
        
                self.btn_convert = ctk.CTkButton(self, text="", fg_color="#28a745", command=self.start_conversion, height=45)
                self.btn_convert.pack(pady=20)
        
            def toggle_theme(self):
                new_mode = "light" if ctk.get_appearance_mode() == "Dark" else "dark"
                ctk.set_appearance_mode(new_mode)
                self.save_settings()
        
            def change_lang(self, v):
                self.lang = v
                t = TRANSLATIONS[v]
                self.lbl_title.configure(text=t['title'])
                self.btn_select.configure(text=t['select'])
                self.lbl_type.configure(text=t['type'])
                self.lbl_fmt.configure(text=t['fmt'])
                self.btn_convert.configure(text=t['convert'])
                
                q_map = {"low": t['low'], "med": t['med'], "high": t['high'], "original": t['original']}
                self.seg_quality.configure(values=list(q_map.values()))
                self.seg_quality.set(t['original'])
                
                self.update_count_label()
                self.save_settings()
        
            def update_count_label(self):
                t = TRANSLATIONS[self.lang]
                self.lbl_count.configure(text=t['files_sel'].format(len(self.file_paths)))
        
            def update_formats(self, mtype):
                self.opt_fmt.configure(values=MEDIA_TYPES[mtype])
                self.opt_fmt.set(MEDIA_TYPES[mtype][0])
                self.save_settings()
        
            def select_files(self):
                paths = filedialog.askopenfilenames()
                if paths:
                    self.file_paths = list(paths)
                    self.update_count_label()
                    
                    ext = os.path.splitext(paths[0])[1][1:].upper()
                    for mtype, exts in MEDIA_TYPES.items():
                        if ext in exts or (ext == 'JPG' and 'JPEG' in exts):
                            self.opt_type.set(mtype)
                            self.update_formats(mtype)
                            break
        
            def start_conversion(self):
                if not self.file_paths: return
                self.save_settings()
                self.btn_convert.configure(state="disabled")
                threading.Thread(target=self.run_process, daemon=True).start()
        
            def run_process(self):
                for i, path in enumerate(self.file_paths):
                    self.convert_logic(path)
                    self.progress_bar.set((i + 1) / len(self.file_paths))
                self.btn_convert.configure(state="normal")
                self.after(0, lambda: messagebox.showinfo("V", TRANSLATIONS[self.lang]['done']))
        
            def convert_logic(self, in_p):
                ext = self.opt_fmt.get().lower()
                mtype = self.opt_type.get()
                
                source_dir = os.path.dirname(in_p)
                folder_name = TRANSLATIONS[self.lang]['out_folder']
                target_dir = os.path.join(source_dir, folder_name)
                
                if not os.path.exists(target_dir):
                    os.makedirs(target_dir)
                    
                out_p = os.path.join(target_dir, f"{os.path.splitext(os.path.basename(in_p))[0]}.{ext}")
                
                # זיהוי רמת האיכות שנבחרה
                t = TRANSLATIONS[self.lang]
                q_val = self.seg_quality.get()
                q_key = next((k for k in ['low', 'med', 'high', 'original'] if t[k] == q_val), 'original')
                
                # הגדרות פרמטרים לפי רמה
                q_cfg = {
                    'low':      {'img': 30, 'vid': '600k',  'aud': '64k'},
                    'med':      {'img': 60, 'vid': '1500k', 'aud': '128k'},
                    'high':     {'img': 85, 'vid': '4000k', 'aud': '256k'},
                    'original': {'img': 95, 'vid': None,    'aud': None}
                }[q_key]
        
                try:
                    if mtype == 'Image':
                        with Image.open(in_p) as img:
                            if ext in ['jpg', 'jpeg'] and img.mode in ("RGBA", "P"):
                                img = img.convert("RGB")
                            if ext == 'pdf': img.convert("RGB").save(out_p, "PDF")
                            else: img.save(out_p, quality=q_cfg['img'], optimize=True)
                    elif mtype == 'Video':
                        with VideoFileClip(in_p) as clip:
                            params = {"codec": "libx264", "logger": None}
                            if q_cfg['vid']: params["bitrate"] = q_cfg['vid']
                            clip.write_videofile(out_p, **params)
                    elif mtype == 'Audio':
                        with AudioFileClip(in_p) as clip:
                            params = {"logger": None}
                            if q_cfg['aud']: params["bitrate"] = q_cfg['aud']
                            clip.write_audiofile(out_p, **params)
                except Exception as e: print(f"Error: {e}")
        
        if __name__ == "__main__":
            app = ConverterApp()
            app.mainloop()
        

        צילום מסך

        468d810c-a457-4c4d-bff6-df3eacb0cc60-image.png


        נ.ב. שימו לב לפני הורדת התוכנה אם אתם שולחים תמונות להדפסה וכו' נא לא להשתמש בתוכנה בד"כ זה מוריד באיכות שלשיתוף תמונות במסך הביתי זה לא פוגע אבל בהדפסה זה פוגע לפעמים

        וכמובן כמו תמיד אם יש לכם הערות לשיפור ושידרוג או שיש לכם ידע בתכנות ואתם רוצים לשפר אשמח לשמוע


        תוכנות נוספות
        להורדה "טמו וידאו אוּףף" תוסף למשתמשי נטפרי להפסקת הפעלת וידאו תצוגה מקדימה בטמו

        תוכנה קטנה לשליטה בתוכנות מסך מלא וסגירה בכח

        ש מנותק
        ש מנותק
        שרגא תכנות
        כתב נערך לאחרונה על ידי
        #4

        @AVIVI חסום להורדה בנטפרי, תודה

        י A 2 תגובות תגובה אחרונה
        1
        • ש שרגא תכנות

          @AVIVI חסום להורדה בנטפרי, תודה

          י מנותק
          י מנותק
          יאיר י.
          כתב נערך לאחרונה על ידי
          #5

          @שרגא-תכנות @avivi
          שאבין, מה זה שונה מפורמט פקטורי החינמי?
          והאם יש בזה דברים יותר מיוחדים משם?

          A CSS 0C 2 תגובות תגובה אחרונה
          0
          • ש שרגא תכנות

            @AVIVI חסום להורדה בנטפרי, תודה

            A מנותק
            A מנותק
            AVIVI
            כתב נערך לאחרונה על ידי
            #6

            @שרגא-תכנות נשלח פנייה תודה על העדכון!

            בעזרת השם נעשה ונצליח....

            תגובה 1 תגובה אחרונה
            1
            • י יאיר י.

              @שרגא-תכנות @avivi
              שאבין, מה זה שונה מפורמט פקטורי החינמי?
              והאם יש בזה דברים יותר מיוחדים משם?

              A מנותק
              A מנותק
              AVIVI
              כתב נערך לאחרונה על ידי
              #7

              @יאיר-י.
              בראש ובראשונה רציתי לפתור את זה https://mitmachim.top/topic/75871/מדריך-לכל-המעוניין-התכתבות-בינה-מלאכותית-בנוגע-לפשעי-אווסט-כדאי-לקרוא
              שזה כולל את פורמט פקטורי
              ועוד ועוד חפש בפורום
              דבר שני התוכנה פשוטה יותר מהירה יותר
              אה... וגם ביידיש😉

              בעזרת השם נעשה ונצליח....

              תגובה 1 תגובה אחרונה
              1
              • J מנותק
                J מנותק
                jc324118983
                כתב נערך לאחרונה על ידי
                #8

                האם הוא עושה את זה בצורה חכמה או סתם מקטין את התמונה?

                A תגובה 1 תגובה אחרונה
                0
                • J jc324118983

                  האם הוא עושה את זה בצורה חכמה או סתם מקטין את התמונה?

                  A מנותק
                  A מנותק
                  AVIVI
                  כתב נערך לאחרונה על ידי
                  #9

                  @jc324118983 למה אתה מתכוין צורה חכמה?

                  בעזרת השם נעשה ונצליח....

                  J תגובה 1 תגובה אחרונה
                  1
                  • A AVIVI

                    @jc324118983 למה אתה מתכוין צורה חכמה?

                    J מנותק
                    J מנותק
                    jc324118983
                    כתב נערך לאחרונה על ידי jc324118983
                    #10

                    @AVIVI יש שתי אופציות להקטין קובץ תמונה לדוגמה יש אופציה פשוט להוריד את כמות הפיקסלים (להקטין את התמונה) ויש בצורה חכמה שאני לא מבין איך זה עובד אבל מוריד משמעותי מבלי לפגוע באיכות

                    A תגובה 1 תגובה אחרונה
                    0
                    • J jc324118983

                      @AVIVI יש שתי אופציות להקטין קובץ תמונה לדוגמה יש אופציה פשוט להוריד את כמות הפיקסלים (להקטין את התמונה) ויש בצורה חכמה שאני לא מבין איך זה עובד אבל מוריד משמעותי מבלי לפגוע באיכות

                      A מנותק
                      A מנותק
                      AVIVI
                      כתב נערך לאחרונה על ידי
                      #11

                      @jc324118983 לדעתי זה 'בצורה חכמה' או איך שתקרא לזה
                      הקטנתי קובץ של 6.8 מ"ב ל 334 ק"ב וכמעט שלא ראיתי הבדל
                      אין לי כרגע תמונה אם תרצה תעלה לכאן ואחזיר לך אותה לאחר המרה

                      בעזרת השם נעשה ונצליח....

                      תגובה 1 תגובה אחרונה
                      2
                      • י יאיר י.

                        @שרגא-תכנות @avivi
                        שאבין, מה זה שונה מפורמט פקטורי החינמי?
                        והאם יש בזה דברים יותר מיוחדים משם?

                        CSS 0C מנותק
                        CSS 0C מנותק
                        CSS 0
                        כתב נערך לאחרונה על ידי CSS 0
                        #12

                        @יאיר-י.

                        זה כבר נהיה מעצבן, מישהו מעלה תוכנה ומייד השאלה הראשונה זה - "מה זה שונה מ..." התשובה היא פשוטה, לא שונה בכלום, לא רוצה אל תשתמש!

                        @jc324118983 כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                        יש בצורה חכמה שאני לא מבין איך זה עובד

                        @AVIVI כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                        לדעתי זה 'בצורה חכמה'

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

                        מה שבטוח, בטוח - התוכנה עצמה איכותית ביותר 😉

                        האקר בשחור

                        א י 2 תגובות תגובה אחרונה
                        2
                        • CSS 0C CSS 0

                          @יאיר-י.

                          זה כבר נהיה מעצבן, מישהו מעלה תוכנה ומייד השאלה הראשונה זה - "מה זה שונה מ..." התשובה היא פשוטה, לא שונה בכלום, לא רוצה אל תשתמש!

                          @jc324118983 כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                          יש בצורה חכמה שאני לא מבין איך זה עובד

                          @AVIVI כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                          לדעתי זה 'בצורה חכמה'

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

                          מה שבטוח, בטוח - התוכנה עצמה איכותית ביותר 😉

                          א מחובר
                          א מחובר
                          ארי
                          כתב נערך לאחרונה על ידי
                          #13

                          @CSS-0 לא קשור לAI זה קיים עוד לפניו
                          תראה לדוגמה
                          Squoosh — מנובמבר 2018
                          TinyPNG — מ2013/2014
                          Caesium — מ2010/2015

                          CSS 0C תגובה 1 תגובה אחרונה
                          0
                          • א ארי

                            @CSS-0 לא קשור לAI זה קיים עוד לפניו
                            תראה לדוגמה
                            Squoosh — מנובמבר 2018
                            TinyPNG — מ2013/2014
                            Caesium — מ2010/2015

                            CSS 0C מנותק
                            CSS 0C מנותק
                            CSS 0
                            כתב נערך לאחרונה על ידי CSS 0
                            #14

                            @ארי כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                            א קשור לAI זה קיים עוד לפניו

                            אתה מדבר על AI של צ'אט, AI של הגדלת הקטנת תמונות, זיהוי פנים, זיהוי דיבור וכ"ו היו לפני

                            Deep Blue של IBM ניצח את Garry Kasparov בשחמט ב־1997...

                            האקר בשחור

                            תגובה 1 תגובה אחרונה
                            0
                            • A AVIVI התייחס לנושא זה
                            • A מנותק
                              A מנותק
                              AVIVI
                              כתב נערך לאחרונה על ידי AVIVI
                              #15

                              בס"ד
                              כ"ח אייר - גירסה חדשה 1.7
                              פירוט למעלה

                              בעזרת השם נעשה ונצליח....

                              H תגובה 1 תגובה אחרונה
                              0
                              • CSS 0C CSS 0

                                @יאיר-י.

                                זה כבר נהיה מעצבן, מישהו מעלה תוכנה ומייד השאלה הראשונה זה - "מה זה שונה מ..." התשובה היא פשוטה, לא שונה בכלום, לא רוצה אל תשתמש!

                                @jc324118983 כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                                יש בצורה חכמה שאני לא מבין איך זה עובד

                                @AVIVI כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                                לדעתי זה 'בצורה חכמה'

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

                                מה שבטוח, בטוח - התוכנה עצמה איכותית ביותר 😉

                                י מנותק
                                י מנותק
                                יאיר י.
                                כתב נערך לאחרונה על ידי יאיר י.
                                #16

                                @CSS-0 כתב בלהורדה | 'תופס תמורתו' ממיר ומקטין קבצים קל, מהיר, וחינמי!💥:

                                זה כבר נהיה מעצבן, מישהו מעלה תוכנה ומייד השאלה הראשונה זה - "מה זה שונה מ..." התשובה היא פשוטה, לא שונה בכלום, לא רוצה אל תשתמש!

                                לא הבנתי על מה אתה מדבר
                                אני, כמו כל אדם, מעוניין להבין מה החידוש שהוא הביא כאן שלא היה קיים בשוק עד עכשיו
                                אווילי לחשוב שבן אדם עבד על משהו, ומבזבז מזמנו על דבר שלא מקדם אף אדם, בשום דבר!!

                                כל אדם שבונה תוכנה או משהו בסגנון התכוון לשפר את המהירות, לתקן פגם קיים בתוכנה ההיא, לשדרג מראה וכו'

                                בתקווה להבנה

                                תגובה 1 תגובה אחרונה
                                1
                                • A AVIVI

                                  בס"ד
                                  כ"ח אייר - גירסה חדשה 1.7
                                  פירוט למעלה

                                  H מנותק
                                  H מנותק
                                  HGEC HARTK
                                  כתב נערך לאחרונה על ידי
                                  #17

                                  @AVIVI
                                  גירסת 1.7 חסום בנטפרי
                                  בתודה מראש

                                  A תגובה 1 תגובה אחרונה
                                  0
                                  • ק מנותק
                                    ק מנותק
                                    קפטן מרשמלו
                                    כתב נערך לאחרונה על ידי
                                    #18

                                    לא צריך בינה מלאכותית בשביל לכווץ קבצים בלי להוריד להם כמעט את האיכות

                                    יש כל מיני דרכים לעשות את זה לתמונות
                                    אחת מהם היא במקום לכתוב בזיכרון מה הערך של כל פיקסל בתמונה כותבים את ההפרשים ביניהם ובגלל שבתמונות בדרך כלל אין הפרשים גדולים במקום שכל פיקסל יתפוס בזיכרון נגיד שלוש ספרות שמייצגות בין אחד לאלף הוא השתמש בשתי ספרות שמייצגות בין אחד ל-100 כל
                                    במקום בתמונה שבו היה הפרש גדול יותר למשל אם היה משהו שחור על רקע לבן אז הקו ביניהם יהיה יותר מטושטש אבל חוץ מזה כל התמונה תשמור על אותה איכות

                                    תגובה 1 תגובה אחרונה
                                    1
                                    • H HGEC HARTK

                                      @AVIVI
                                      גירסת 1.7 חסום בנטפרי
                                      בתודה מראש

                                      A מנותק
                                      A מנותק
                                      AVIVI
                                      כתב נערך לאחרונה על ידי
                                      #19

                                      @HGEC-HARTK נשלח לבדיקה

                                      בעזרת השם נעשה ונצליח....

                                      א תגובה 1 תגובה אחרונה
                                      0
                                      • A AVIVI

                                        בס"ד

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

                                        תופס תמורתו

                                        כרגיל כל דבר טוב מתחיל כי נמאס מה שהיה עד עכשיו (מי הזיז את ה(ג)בינה שלי?)

                                        בס"ד עלה בדעתי ליצור תוכנה להמרת קבצים ע"י הגבינה המלאכותית
                                        ובמיוחד להקטנת קבצים (שם החל הרעיון... נמאס לי להעלות חמש תמונות למייל במשך שעה רק בגלל שהמצלמה שלי טובה ב"ה...)
                                        תמיד יש לנו את הוידאו ששוקל טון ואת התמונה של הנוף ששוקלת 15 מ"ב ואת השיר שתופס הרבה מקום
                                        לשם כך ולעוד דברים נוספים נועד תופס תמורתו
                                        התוכנה להמרת קבצים בשניות שבע"ה תקל לנו מעט את החיים
                                        התוכנה כרגע ממירה וידאו אודיו ותמונה
                                        פותחים את התוכנה, בוחרים את הקובץ והיפ הופ הקובץ נחתך למחצה שליש ורביע לפי בחירתכם!
                                        הקבצים נשמרים בתקייה חדשה בשם 'קבצים_שהומרו' או בכל שפה אחרת שבחרתם כשפת התוכנה
                                        התוכנה תומכת בפורמטים המצויים
                                        התוכנה תומכת גם בהמרת תמונה ל- pdf ובהמרת וידאו לקובץ gif

                                        הערה חשובה לגבי הוידאו: כרגע לוקח קצת הרבה זמן לתוכנה להמיר קבצי וידאו אולם התוצאה שווה ככל שבדקתי!
                                        המרתי איתה קובץ וידאו במשקל 67 מ"ב ולאחר ההמרה (כ-5 דק' מעבד i5) התקבל קובץ במשקל 18.7 מ"ב ללא פגיעה באיכות הנראית לעין!!!
                                        רק ההמרה לקחה לי הרבה מהמעבד אז שימו לב! בגרסה הבאה אשתדל שתהיה יותר הגבלה במעבד בע"ה

                                        התוכנה קצת בוסרית בע"ה אני עובד לשפרה ולשכללה עדכונים יובאו כאן בהמשך

                                        להורדה👇
                                        כ"ח אייר - גירסה חדשה 1.7
                                        להוריד כוכביות מהקישור

                                        TofesTmurato1.7v

                                        • תיקון באג ותמיכה בהמרה לגרסאות שונות
                                        • שמירת הגדרות משתמש
                                        • הוספת מצב יום/לילה
                                        • שיפור התרגום והוספת שפה😉
                                        • לא תוקן עדיין הגבלת מעבד

                                        גרסאות קודמות בספויילר

                                        TofesTmurato 1v

                                        קוד פתוח למעוניינים


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

                                        # -*- coding: utf-8 -*-
                                        import sys, os, threading, json, tkinter as tk
                                        from tkinter import filedialog, messagebox
                                        from PIL import Image
                                        import customtkinter as ctk
                                        
                                        try:
                                            from moviepy.editor import VideoFileClip, AudioFileClip
                                        except Exception:
                                            print("Missing moviepy. Install with: pip install moviepy")
                                            sys.exit(1)
                                        
                                        def resource_path(relative_path):
                                            try:
                                                base_path = sys._MEIPASS
                                            except Exception:
                                                base_path = os.path.abspath(".")
                                            return os.path.join(base_path, relative_path)
                                        
                                        SETTINGS_FILE = os.path.join(os.getenv('APPDATA', os.path.expanduser('~')), 'tmurato_settings.json')
                                        
                                        MEDIA_TYPES = {
                                            'Video': ['MP4', 'GIF', 'MOV', 'MKV', 'WEBM', 'AVI'],
                                            'Audio': ['MP3', 'WAV', 'M4A', 'FLAC', 'AAC'],
                                            'Image': ['JPG', 'JPEG', 'PNG', 'WEBP', 'PDF', 'ICO', 'BMP']
                                        }
                                        
                                        TRANSLATIONS = {
                                            'עברית': {
                                                'title': 'תופס תמורתו - ממיר מקצועי', 'select': 'קבצים בחר', 'convert': 'הכל המר',
                                                'low': 'נמוכה', 'med': 'בינונית', 'high': 'גבוהה', 'original': 'מקור',
                                                'files_sel': 'נבחרו {} קבצים', 'done': '!בסייעתא דשמייא ההמרה הסתיימה בהצלחה', 
                                                'type': ':הקובץ סוג', 'fmt': ':פורמט', 'out_folder': 'קבצים שהומרו'
                                            },
                                            'English': {
                                                'title': 'Tofes Tmurato - Converter', 'select': 'Select Files', 'convert': 'Convert All',
                                                'low': 'Low', 'med': 'Med', 'high': 'High', 'original': 'Original',
                                                'files_sel': '{} files selected', 'done': 'Done!', 
                                                'type': 'Type:', 'fmt': 'Format:', 'out_folder': 'Converted files'
                                            },
                                            'יידיש': {
                                                'title': 'תופס תמורתו - מעדיאַ קאָנוערטער', 'select': 'קלייַבן טעקעס', 'convert': 'קאָנווערט אַלץ',
                                                'low': 'נידעריק', 'med': 'מיטל', 'high': 'הויך', 'original': 'מקור',
                                                'files_sel': '{} טעקעס אויסגעקליבן', 'done': '!בסייעתא דשמייא געענדיקט הצלחה', 
                                                'type': 'טיפּ', 'fmt': 'פֿאָרמאַט', 'out_folder': 'קאָנווערטירטע טעקעס'
                                            },
                                            'ארמית': {
                                                'title': 'תופס תמורתו - מחלף זמניא', 'select': 'מניינא גבי', 'convert': 'כולא חלף',
                                                'low': 'זוטא', 'med': 'ממוצע', 'high': 'רבא', 'original': 'עיקרא',
                                                'files_sel': 'גבייתא {} מניינין', 'done': '!בסייעתא דשמייא חילוף זמניא אשתלם שפיר', 
                                                'type': ':זניא', 'fmt': ':טופסא', 'out_folder': 'מניינין דאשתני'
                                            }
                                        }
                                        
                                        class ConverterApp(ctk.CTk):
                                            def __init__(self):
                                                super().__init__()
                                                self.file_paths = []
                                                self.settings = self.load_settings()
                                                
                                                icon_path = resource_path("icon.ico")
                                                if os.path.exists(icon_path):
                                                    self.iconbitmap(icon_path)
                                                    self.after(200, lambda: self.iconbitmap(icon_path))
                                        
                                                saved_lang = self.settings.get('lang', 'עברית')
                                                self.lang = saved_lang if saved_lang in TRANSLATIONS else 'עברית'
                                                
                                                self.setup_ui()
                                                self.apply_saved_settings()
                                        
                                            def load_settings(self):
                                                if os.path.exists(SETTINGS_FILE):
                                                    try:
                                                        with open(SETTINGS_FILE, 'r') as f: return json.load(f)
                                                    except: pass
                                                return {'lang': 'עברית'}
                                        
                                            def save_settings(self):
                                                self.settings.update({
                                                    'lang': self.lang, 'quality': self.seg_quality.get(), 
                                                    'mtype': self.opt_type.get(), 'fmt': self.opt_fmt.get(), 
                                                    'theme': ctk.get_appearance_mode()
                                                })
                                                with open(SETTINGS_FILE, 'w') as f: json.dump(self.settings, f)
                                        
                                            def apply_saved_settings(self):
                                                self.change_lang(self.lang)
                                                self.opt_type.set(self.settings.get('mtype', 'Video'))
                                                self.update_formats(self.opt_type.get())
                                                self.opt_fmt.set(self.settings.get('fmt', 'MP4'))
                                                if 'theme' in self.settings: ctk.set_appearance_mode(self.settings['theme'])
                                        
                                            def setup_ui(self):
                                                self.geometry("450x650")
                                                self.title("Tofes Tmurato 1.7")
                                                
                                                self.header = ctk.CTkFrame(self, fg_color="transparent")
                                                self.header.pack(pady=10, fill="x", padx=20)
                                                
                                                self.theme_btn = ctk.CTkButton(self.header, text="🌓", width=40, command=self.toggle_theme)
                                                self.theme_btn.pack(side="left")
                                                
                                                self.lang_menu = ctk.CTkOptionMenu(self.header, values=list(TRANSLATIONS.keys()), command=self.change_lang, width=100)
                                                self.lang_menu.pack(side="right")
                                        
                                                self.lbl_title = ctk.CTkLabel(self, text="", font=("Arial", 22, "bold"))
                                                self.lbl_title.pack(pady=10)
                                        
                                                self.btn_select = ctk.CTkButton(self, text="", command=self.select_files)
                                                self.btn_select.pack(pady=10)
                                        
                                                self.lbl_count = ctk.CTkLabel(self, text="", font=("Arial", 14))
                                                self.lbl_count.pack(pady=5)
                                        
                                                self.sett_frame = ctk.CTkFrame(self)
                                                self.sett_frame.pack(pady=10, padx=30, fill="both")
                                        
                                                self.lbl_type = ctk.CTkLabel(self.sett_frame, text="")
                                                self.lbl_type.pack()
                                                self.opt_type = ctk.CTkOptionMenu(self.sett_frame, values=list(MEDIA_TYPES.keys()), command=self.update_formats)
                                                self.opt_type.pack(pady=5)
                                        
                                                self.lbl_fmt = ctk.CTkLabel(self.sett_frame, text="")
                                                self.lbl_fmt.pack()
                                                self.opt_fmt = ctk.CTkOptionMenu(self.sett_frame, values=[])
                                                self.opt_fmt.pack(pady=5)
                                        
                                                self.seg_quality = ctk.CTkSegmentedButton(self.sett_frame)
                                                self.seg_quality.pack(pady=20, padx=10, fill="x")
                                        
                                                self.progress_bar = ctk.CTkProgressBar(self)
                                                self.progress_bar.pack(pady=10, padx=50, fill="x")
                                                self.progress_bar.set(0)
                                        
                                                self.btn_convert = ctk.CTkButton(self, text="", fg_color="#28a745", command=self.start_conversion, height=45)
                                                self.btn_convert.pack(pady=20)
                                        
                                            def toggle_theme(self):
                                                new_mode = "light" if ctk.get_appearance_mode() == "Dark" else "dark"
                                                ctk.set_appearance_mode(new_mode)
                                                self.save_settings()
                                        
                                            def change_lang(self, v):
                                                self.lang = v
                                                t = TRANSLATIONS[v]
                                                self.lbl_title.configure(text=t['title'])
                                                self.btn_select.configure(text=t['select'])
                                                self.lbl_type.configure(text=t['type'])
                                                self.lbl_fmt.configure(text=t['fmt'])
                                                self.btn_convert.configure(text=t['convert'])
                                                
                                                q_map = {"low": t['low'], "med": t['med'], "high": t['high'], "original": t['original']}
                                                self.seg_quality.configure(values=list(q_map.values()))
                                                self.seg_quality.set(t['original'])
                                                
                                                self.update_count_label()
                                                self.save_settings()
                                        
                                            def update_count_label(self):
                                                t = TRANSLATIONS[self.lang]
                                                self.lbl_count.configure(text=t['files_sel'].format(len(self.file_paths)))
                                        
                                            def update_formats(self, mtype):
                                                self.opt_fmt.configure(values=MEDIA_TYPES[mtype])
                                                self.opt_fmt.set(MEDIA_TYPES[mtype][0])
                                                self.save_settings()
                                        
                                            def select_files(self):
                                                paths = filedialog.askopenfilenames()
                                                if paths:
                                                    self.file_paths = list(paths)
                                                    self.update_count_label()
                                                    
                                                    ext = os.path.splitext(paths[0])[1][1:].upper()
                                                    for mtype, exts in MEDIA_TYPES.items():
                                                        if ext in exts or (ext == 'JPG' and 'JPEG' in exts):
                                                            self.opt_type.set(mtype)
                                                            self.update_formats(mtype)
                                                            break
                                        
                                            def start_conversion(self):
                                                if not self.file_paths: return
                                                self.save_settings()
                                                self.btn_convert.configure(state="disabled")
                                                threading.Thread(target=self.run_process, daemon=True).start()
                                        
                                            def run_process(self):
                                                for i, path in enumerate(self.file_paths):
                                                    self.convert_logic(path)
                                                    self.progress_bar.set((i + 1) / len(self.file_paths))
                                                self.btn_convert.configure(state="normal")
                                                self.after(0, lambda: messagebox.showinfo("V", TRANSLATIONS[self.lang]['done']))
                                        
                                            def convert_logic(self, in_p):
                                                ext = self.opt_fmt.get().lower()
                                                mtype = self.opt_type.get()
                                                
                                                source_dir = os.path.dirname(in_p)
                                                folder_name = TRANSLATIONS[self.lang]['out_folder']
                                                target_dir = os.path.join(source_dir, folder_name)
                                                
                                                if not os.path.exists(target_dir):
                                                    os.makedirs(target_dir)
                                                    
                                                out_p = os.path.join(target_dir, f"{os.path.splitext(os.path.basename(in_p))[0]}.{ext}")
                                                
                                                # זיהוי רמת האיכות שנבחרה
                                                t = TRANSLATIONS[self.lang]
                                                q_val = self.seg_quality.get()
                                                q_key = next((k for k in ['low', 'med', 'high', 'original'] if t[k] == q_val), 'original')
                                                
                                                # הגדרות פרמטרים לפי רמה
                                                q_cfg = {
                                                    'low':      {'img': 30, 'vid': '600k',  'aud': '64k'},
                                                    'med':      {'img': 60, 'vid': '1500k', 'aud': '128k'},
                                                    'high':     {'img': 85, 'vid': '4000k', 'aud': '256k'},
                                                    'original': {'img': 95, 'vid': None,    'aud': None}
                                                }[q_key]
                                        
                                                try:
                                                    if mtype == 'Image':
                                                        with Image.open(in_p) as img:
                                                            if ext in ['jpg', 'jpeg'] and img.mode in ("RGBA", "P"):
                                                                img = img.convert("RGB")
                                                            if ext == 'pdf': img.convert("RGB").save(out_p, "PDF")
                                                            else: img.save(out_p, quality=q_cfg['img'], optimize=True)
                                                    elif mtype == 'Video':
                                                        with VideoFileClip(in_p) as clip:
                                                            params = {"codec": "libx264", "logger": None}
                                                            if q_cfg['vid']: params["bitrate"] = q_cfg['vid']
                                                            clip.write_videofile(out_p, **params)
                                                    elif mtype == 'Audio':
                                                        with AudioFileClip(in_p) as clip:
                                                            params = {"logger": None}
                                                            if q_cfg['aud']: params["bitrate"] = q_cfg['aud']
                                                            clip.write_audiofile(out_p, **params)
                                                except Exception as e: print(f"Error: {e}")
                                        
                                        if __name__ == "__main__":
                                            app = ConverterApp()
                                            app.mainloop()
                                        

                                        צילום מסך

                                        468d810c-a457-4c4d-bff6-df3eacb0cc60-image.png


                                        נ.ב. שימו לב לפני הורדת התוכנה אם אתם שולחים תמונות להדפסה וכו' נא לא להשתמש בתוכנה בד"כ זה מוריד באיכות שלשיתוף תמונות במסך הביתי זה לא פוגע אבל בהדפסה זה פוגע לפעמים

                                        וכמובן כמו תמיד אם יש לכם הערות לשיפור ושידרוג או שיש לכם ידע בתכנות ואתם רוצים לשפר אשמח לשמוע


                                        תוכנות נוספות
                                        להורדה "טמו וידאו אוּףף" תוסף למשתמשי נטפרי להפסקת הפעלת וידאו תצוגה מקדימה בטמו

                                        תוכנה קטנה לשליטה בתוכנות מסך מלא וסגירה בכח

                                        EBAE מנותק
                                        EBAE מנותק
                                        EBA
                                        מדריכים
                                        כתב נערך לאחרונה על ידי
                                        #20

                                        @AVIVI לפי השם כבר הייתי בטוח שזו תוכנה של @es0583292679 ...

                                        התקנת מולטימדיות, חסימות וסימים מוזלים
                                        050-4133851

                                        A תגובה 1 תגובה אחרונה
                                        3
                                        • EBAE EBA

                                          @AVIVI לפי השם כבר הייתי בטוח שזו תוכנה של @es0583292679 ...

                                          A מנותק
                                          A מנותק
                                          AVIVI
                                          כתב נערך לאחרונה על ידי AVIVI
                                          #21

                                          @EBA

                                          לא חושב לנסות לחקות את אליעזר סילבר @es0583292679 האלוף!..
                                          רעיון השם היה משום שנמאס לי שמתביישים במושגים שיש לנו
                                          קצת ויגבה ליבו!
                                          ואם פיתחתי תוכנה לציבור יראי ה' למה ששם התוכנה לא יתחבר אליהם?
                                          אה.. וגם השפה החדשה..

                                          בעזרת השם נעשה ונצליח....

                                          תגובה 1 תגובה אחרונה
                                          2

                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • חוקי הפורום
                                          • פופולרי
                                          • לא נפתר
                                          • משתמשים
                                          • חיפוש גוגל בפורום
                                          • צור קשר