├── .gitignore ├── LICENSE ├── README.md ├── advpng ├── Makefile ├── advpng.xcodeproj │ └── project.pbxproj └── config.h ├── gifsicle ├── Makefile ├── config.h ├── gifsicle-1.64-imageoptim.patch └── gifsicle.xcodeproj │ └── project.pbxproj ├── imageoptim ├── .tx │ └── config ├── DragDropImageView.h ├── DragDropImageView.m ├── File.h ├── File.m ├── FilesQueue.h ├── FilesQueue.m ├── GetQueueCountCommand.h ├── GetQueueCountCommand.m ├── ImageOptim.icns ├── ImageOptim.xcodeproj │ └── project.pbxproj ├── ImageOptimController.h ├── ImageOptimController.m ├── ImageOptimVerbs.sdef ├── Info.plist ├── Makefile ├── MyTableView.h ├── MyTableView.m ├── PrefsController.h ├── PrefsController.m ├── ResultsDb.h ├── ResultsDb.m ├── RevealButtonCell.h ├── RevealButtonCell.m ├── SavingsFormatter.h ├── SavingsFormatter.m ├── Transformers.h ├── Transformers.m ├── Workers │ ├── AdvCompWorker.h │ ├── AdvCompWorker.m │ ├── CommandWorker.h │ ├── CommandWorker.m │ ├── DirWorker.h │ ├── DirWorker.m │ ├── GifsicleWorker.h │ ├── GifsicleWorker.m │ ├── JpegoptimWorker.h │ ├── JpegoptimWorker.m │ ├── JpegtranWorker.h │ ├── JpegtranWorker.m │ ├── OptiPngWorker.h │ ├── OptiPngWorker.m │ ├── PngCrushWorker.h │ ├── PngCrushWorker.m │ ├── PngQuantWorker.h │ ├── PngQuantWorker.m │ ├── PngoutWorker.h │ ├── PngoutWorker.m │ ├── Worker.h │ ├── Worker.m │ ├── ZopfliWorker.h │ └── ZopfliWorker.m ├── appcast.xml ├── cs.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── da.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── de.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── debug.xcconfig ├── defaults.plist ├── dsa_pub.pem ├── el.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── en-GB.lproj │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── en.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── MainMenu.strings │ ├── MainMenu.xib │ ├── PrefsController.strings │ └── PrefsController.xib ├── err.png ├── err@2x.png ├── es.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── fr.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── getsparkle.sh ├── it.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── ja.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── ko.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── log.h ├── lt.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── main.m ├── makehelp.sh ├── nl.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── no.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── noopt.png ├── noopt@2x.png ├── ok.png ├── ok@2x.png ├── optimal_file_list ├── pl.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── progress.png ├── progress@2x.png ├── pt-BR.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── pt.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── release.xcconfig ├── ru.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── sign_update.rb ├── sk.lproj │ ├── MainMenu.xib │ └── PrefsController.xib ├── style.css ├── sv.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── tr.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── update_appcast.php ├── vi.lproj │ ├── Credits.html │ ├── Help │ │ ├── index.html │ │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── wait.png ├── wait@2x.png └── zh-Hant.lproj │ ├── Credits.html │ ├── Help │ ├── index.html │ └── prefs.html │ ├── Localizable.strings │ ├── MainMenu.xib │ └── PrefsController.xib ├── jpegoptim ├── Makefile ├── config.h ├── jpeg-6b │ └── jpeg.xcodeproj │ │ └── project.pbxproj └── jpegoptim.xcodeproj │ └── project.pbxproj ├── jpegtran ├── jpegrescan └── jpegtran.xcodeproj │ └── project.pbxproj ├── libjpeg ├── Makefile ├── jconfig.h ├── jpeg.xcodeproj │ └── project.pbxproj └── remove_unused_features.diff ├── libpng ├── Makefile ├── config.h └── libpng.xcodeproj │ └── project.pbxproj ├── optipng ├── Makefile ├── dirtyalpha.patch ├── optipng.xcodeproj │ └── project.pbxproj └── remove_nonpng_formats.patch ├── pngcrush ├── Makefile ├── pngcrush.patch └── pngcrush.xcodeproj │ └── project.pbxproj ├── pngquant ├── Makefile └── pngquant.xcodeproj │ └── project.pbxproj ├── zlib └── Makefile └── zopfli-png ├── Makefile └── zopfli-png.xcodeproj └── project.pbxproj /README.md: -------------------------------------------------------------------------------- 1 | #ImageOptim 2 | 3 | [ImageOptim](http://imageoptim.com) is a GUI for lossless image optimization tools: PNGOUT, AdvPNG, Pngcrush, OptiPNG, JpegOptim, jpegrescan, jpegtran, and Gifsicle. 4 | 5 | To get started, open `imageoptim/ImageOptim.xcodeproj`. It will automatically download and build all subprojects when run. 6 | 7 | -------------------------------------------------------------------------------- /advpng/Makefile: -------------------------------------------------------------------------------- 1 | 2 | repng.cc: 3 | curl -L http://sourceforge.net/projects/advancemame/files/advancecomp/1.15/advancecomp-1.15.tar.gz/download | tar xz --strip-components=1 4 | 5 | clean: 6 | 7 | install: 8 | 9 | -------------------------------------------------------------------------------- /advpng/config.h: -------------------------------------------------------------------------------- 1 | /* config.h. Generated by configure. */ 2 | /* config.h.in. Generated from configure.ac by autoheader. */ 3 | 4 | /* Define to 1 if you have the header file, and it defines `DIR'. 5 | */ 6 | #define HAVE_DIRENT_H 1 7 | 8 | /* Define to 1 if you have the `getopt' function. */ 9 | #define HAVE_GETOPT 1 10 | 11 | /* Define to 1 if you have the header file. */ 12 | #define HAVE_GETOPT_H 1 13 | 14 | /* Define to 1 if you have the `getopt_long' function. */ 15 | #define HAVE_GETOPT_LONG 1 16 | 17 | /* Define to 1 if you have the header file. */ 18 | #define HAVE_INTTYPES_H 1 19 | 20 | /* Define to 1 if you have the `z' library (-lz). */ 21 | #define HAVE_LIBZ 1 22 | 23 | /* Define to 1 if you have the header file. */ 24 | #define HAVE_MEMORY_H 1 25 | 26 | /* Define to 1 if you have the header file, and it defines `DIR'. */ 27 | /* #undef HAVE_NDIR_H */ 28 | 29 | /* Define to 1 if you have the `snprintf' function. */ 30 | #define HAVE_SNPRINTF 1 31 | 32 | /* Define to 1 if you have the header file. */ 33 | #define HAVE_STDARG_H 1 34 | 35 | /* Define to 1 if you have the header file. */ 36 | #define HAVE_STDINT_H 1 37 | 38 | /* Define to 1 if you have the header file. */ 39 | #define HAVE_STDLIB_H 1 40 | 41 | /* Define to 1 if you have the header file. */ 42 | #define HAVE_STRINGS_H 1 43 | 44 | /* Define to 1 if you have the header file. */ 45 | #define HAVE_STRING_H 1 46 | 47 | /* Define to 1 if you have the header file, and it defines `DIR'. 48 | */ 49 | /* #undef HAVE_SYS_DIR_H */ 50 | 51 | /* Define to 1 if you have the header file, and it defines `DIR'. 52 | */ 53 | /* #undef HAVE_SYS_NDIR_H */ 54 | 55 | /* Define to 1 if you have the header file. */ 56 | #define HAVE_SYS_STAT_H 1 57 | 58 | /* Define to 1 if you have the header file. */ 59 | #define HAVE_SYS_TIME_H 1 60 | 61 | /* Define to 1 if you have the header file. */ 62 | #define HAVE_SYS_TYPES_H 1 63 | 64 | /* Define to 1 if you have the header file. */ 65 | /* #undef HAVE_SYS_UTIME_H */ 66 | 67 | /* Define to 1 if you have that is POSIX.1 compatible. */ 68 | #define HAVE_SYS_WAIT_H 1 69 | 70 | /* Define to 1 if you have the header file. */ 71 | #define HAVE_UNISTD_H 1 72 | 73 | /* Define to 1 if you have the header file. */ 74 | #define HAVE_UTIME_H 1 75 | 76 | /* Define to 1 if you have the `vsnprintf' function. */ 77 | #define HAVE_VSNPRINTF 1 78 | 79 | /* Name of package */ 80 | #define PACKAGE "advancecomp" 81 | 82 | /* Define to the address where bug reports for this package should be sent. */ 83 | #define PACKAGE_BUGREPORT "" 84 | 85 | /* Define to the full name of this package. */ 86 | #define PACKAGE_NAME "AdvanceCOMP" 87 | 88 | /* Define to the full name and version of this package. */ 89 | #define PACKAGE_STRING "AdvanceCOMP 1.15" 90 | 91 | /* Define to the one symbol short name of this package. */ 92 | #define PACKAGE_TARNAME "advancecomp" 93 | 94 | /* Define to the version of this package. */ 95 | #define PACKAGE_VERSION "1.15" 96 | 97 | /* Define to 1 if you have the ANSI C header files. */ 98 | #define STDC_HEADERS 1 99 | 100 | /* Define to 1 if you can safely include both and . */ 101 | #define TIME_WITH_SYS_TIME 1 102 | 103 | /* Use the 7z library */ 104 | #define USE_7Z 1 105 | 106 | #define USE_ERROR_SILENT 1 107 | 108 | /* Version number of package */ 109 | #define VERSION "1.15" 110 | 111 | /* Define to empty if `const' does not conform to ANSI C. */ 112 | /* #undef const */ 113 | 114 | /* Define to `__inline__' or `__inline' if that's what the C compiler 115 | calls it, or to nothing if 'inline' is not supported under any name. */ 116 | #ifndef __cplusplus 117 | /* #undef inline */ 118 | #endif 119 | -------------------------------------------------------------------------------- /gifsicle/Makefile: -------------------------------------------------------------------------------- 1 | 2 | src/gifsicle.c: 3 | curl http://www.lcdf.org/gifsicle/gifsicle-1.68.tar.gz | tar xz --strip-components=1 --exclude=Makefile 4 | patch -p1 < gifsicle-1.64-imageoptim.patch 5 | 6 | clean: 7 | test ./src/gifsicle.c && rm -rf ./src 8 | 9 | install: 10 | 11 | -------------------------------------------------------------------------------- /imageoptim/.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = zh_TW:zh-Hant, en_GB:en-GB, pt_BR:pt-BR 4 | 5 | [imageoptim.localizablestrings] 6 | file_filter = .lproj/Localizable.strings 7 | source_lang = en_US 8 | 9 | [imageoptim.mainmenustrings] 10 | file_filter = .lproj/MainMenu.strings 11 | source_lang = en_US 12 | 13 | [imageoptim.prefsstrings] 14 | file_filter = .lproj/PrefsController.strings 15 | source_lang = en_US 16 | 17 | [imageoptim.helpindexhtml] 18 | file_filter = .lproj/Help/index.html 19 | source_lang = en_US 20 | 21 | [imageoptim.help-prefshtml] 22 | file_filter = .lproj/Help/prefs.html 23 | source_lang = en_US 24 | 25 | [imageoptim.creditshtml] 26 | file_filter = .lproj/Credits.html 27 | source_lang = en_US 28 | 29 | [imageoptim.credits] 30 | file_filter = .lproj/Credits.html 31 | source_lang = en_US 32 | 33 | -------------------------------------------------------------------------------- /imageoptim/DragDropImageView.h: -------------------------------------------------------------------------------- 1 | 2 | #import 3 | #import 4 | #import 5 | 6 | #import "FilesQueue.h" 7 | 8 | @interface DragDropImageView : NSView 9 | { 10 | BOOL highlight; //highlight the drop zone 11 | BOOL smoothSizes; // use blurry fractional sizes for smooth animation during live resize 12 | 13 | IBOutlet FilesQueue *filesQueue; 14 | } 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /imageoptim/File.h: -------------------------------------------------------------------------------- 1 | // 2 | // File.h 3 | // 4 | // Created by porneL on 8.wrz.07. 5 | // 6 | 7 | #import 8 | #import 9 | #import "Workers/Worker.h" 10 | 11 | @class ResultsDb; 12 | 13 | enum IOFileType { 14 | FILETYPE_PNG=1, 15 | FILETYPE_JPEG, 16 | FILETYPE_GIF 17 | }; 18 | 19 | @interface File : NSObject { 20 | NSURL *filePath, *revertPath; 21 | NSString *displayName; 22 | 23 | /** size of file before any optimizations */ 24 | NSUInteger byteSizeOriginal; 25 | /** expected current size of file on disk, updated before and after optimization */ 26 | NSUInteger byteSizeOnDisk; 27 | /** current best estimate of what optimized file size will be */ 28 | NSUInteger byteSizeOptimized; 29 | 30 | NSString *bestToolName; 31 | NSMutableDictionary *bestTools; 32 | double percentDone; 33 | 34 | NSMutableSet *filePathsOptimizedInUse; 35 | NSURL *filePathOptimized; 36 | 37 | NSImage *statusImage; 38 | NSString *statusText; 39 | NSInteger statusOrder; 40 | 41 | NSMutableArray *workers; 42 | NSMutableDictionary *workersPreviousResults; 43 | 44 | NSOperationQueue *fileIOQueue; 45 | ResultsDb *db; 46 | uint32_t settingsHash[4]; 47 | uint32_t inputFileHash[4]; 48 | 49 | enum IOFileType fileType; 50 | BOOL done, optimized; 51 | } 52 | 53 | -(BOOL)isBusy; 54 | -(BOOL)isOptimized; 55 | -(BOOL)isDone; 56 | 57 | -(BOOL)revert; 58 | @property (readonly) BOOL canRevert; 59 | 60 | -(void)enqueueWorkersInCPUQueue:(NSOperationQueue *)queue fileIOQueue:(NSOperationQueue *)fileIOQueue; 61 | 62 | -(BOOL)setFilePathOptimized:(NSURL *)f size:(NSUInteger)s toolName:(NSString*)s; 63 | 64 | -(instancetype)initWithFilePath:(NSURL *)aPath resultsDatabase:(ResultsDb*)aDb; 65 | -(id)copyWithZone:(NSZone *)zone; 66 | -(void)resetToOriginalByteSize:(NSUInteger)size; 67 | -(void)setByteSizeOptimized:(NSUInteger)size; 68 | -(BOOL)isOptimized; 69 | -(void)updateStatusOfWorker:(Worker *)currentWorker running:(BOOL)started; 70 | 71 | -(BOOL)isLarge; 72 | -(BOOL)isSmall; 73 | 74 | -(void)setFilePath:(NSURL *)s; 75 | 76 | @property (readonly, copy) NSString *fileName; 77 | @property (readonly, copy) NSString *mimeType; 78 | 79 | @property (strong) NSString *statusText, *displayName, *bestToolName; 80 | @property (strong,nonatomic) NSURL *filePath; 81 | @property (strong,readonly) NSURL *filePathOptimized; 82 | @property (strong) NSImage *statusImage; 83 | @property (assign,nonatomic) NSUInteger byteSizeOriginal, byteSizeOptimized; 84 | @property (assign,readonly) NSInteger statusOrder; 85 | @property (strong,readonly) NSMutableDictionary *workersPreviousResults; 86 | 87 | @property (assign) double percentDone; 88 | 89 | -(void)setStatus:(NSString *)name order:(NSInteger)order text:(NSString*)text; 90 | -(void)cleanup; 91 | 92 | +(NSInteger)fileByteSize:(NSURL *)afile; 93 | 94 | 95 | -(void)doEnqueueWorkersInCPUQueue:(NSOperationQueue *)queue; 96 | @end 97 | -------------------------------------------------------------------------------- /imageoptim/FilesQueue.h: -------------------------------------------------------------------------------- 1 | // 2 | // FilesQueue.h 3 | // 4 | // Created by porneL on 23.wrz.07. 5 | // 6 | 7 | #import 8 | #import 9 | 10 | @class File, ResultsDb; 11 | extern NSString *const kFilesQueueFinished; 12 | 13 | @interface FilesQueue : NSArrayController { 14 | NSTableView *tableView; 15 | BOOL isEnabled, isBusy; 16 | NSInteger nextInsertRow; 17 | NSOperationQueue *cpuQueue; 18 | NSOperationQueue *fileIOQueue; 19 | NSOperationQueue *dirWorkerQueue; 20 | 21 | NSHashTable *seenPathHashes; 22 | ResultsDb *db; 23 | 24 | NSLock *queueWaitingLock; 25 | } 26 | 27 | -(void)configureWithTableView:(NSTableView*)a; 28 | 29 | - (NSString *)tableView:(NSTableView *)aTableView toolTipForCell:(NSCell *)aCell rect:(NSRectPointer)rect tableColumn:(NSTableColumn *)aTableColumn row:(int)row mouseLocation:(NSPoint)mouseLocation; 30 | -(void)addURLsBelowSelection:(NSArray *)paths; 31 | -(BOOL)addURLs:(NSArray *)paths; 32 | -(BOOL)addPaths:(NSArray *)paths; 33 | -(BOOL)addURLs:(NSArray *)paths filesOnly:(BOOL)t; 34 | 35 | -(void) moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet 36 | toIndex:(NSUInteger)insertIndex; 37 | - (NSUInteger)rowsAboveRow:(NSUInteger)row inIndexSet:(NSIndexSet *)indexSet; 38 | - (NSUInteger)numberOfRowsInTableView:(NSTableView *)tableview; 39 | 40 | -(void)startAgainOptimized:(BOOL)optimized; 41 | -(BOOL)canStartAgainOptimized:(BOOL)optimized; 42 | -(void)clearComplete; 43 | @property (readonly) BOOL canClearComplete; 44 | -(void)revert; 45 | @property (readonly) BOOL canRevert; 46 | -(void)cleanup; 47 | -(void)setRow:(NSInteger)row; 48 | 49 | @property (readonly, copy) NSArray *fileTypes; 50 | 51 | @property (unsafe_unretained, readonly, nonatomic) NSNumber *queueCount; 52 | @property (readonly) BOOL isBusy; 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /imageoptim/GetQueueCountCommand.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | /* This class implements a simple verb with no parameters. The verb 5 | returns an integer number. Verbs don't get much simpler than this. */ 6 | 7 | @interface GetQueueCountCommand : NSScriptCommand { 8 | 9 | } 10 | 11 | - (id)performDefaultImplementation; 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /imageoptim/GetQueueCountCommand.m: -------------------------------------------------------------------------------- 1 | #import "GetQueueCountCommand.h" 2 | #import "ImageOptimController.h" 3 | #import "FilesQueue.h" 4 | 5 | @implementation GetQueueCountCommand 6 | 7 | - (id)performDefaultImplementation { 8 | ImageOptimController *imageoptim = (ImageOptimController *)[[NSApplication sharedApplication] delegate]; 9 | 10 | return imageoptim.filesQueue.queueCount; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /imageoptim/ImageOptim.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/ImageOptim.icns -------------------------------------------------------------------------------- /imageoptim/ImageOptimController.h: -------------------------------------------------------------------------------- 1 | /* ImageOptim */ 2 | #import 3 | 4 | extern NSDictionary *statusImages; 5 | 6 | @class FilesQueue; 7 | @class PrefsController; 8 | 9 | @interface ImageOptimController : NSObject 10 | { 11 | IBOutlet NSTableView *tableView; 12 | IBOutlet FilesQueue *__unsafe_unretained filesController; 13 | 14 | PrefsController *prefsController; 15 | 16 | IBOutlet NSProgressIndicator *progressBar; 17 | IBOutlet NSTextField *statusBarLabel; 18 | IBOutlet NSTextView *credits; 19 | 20 | IBOutlet NSTableColumn *sizeColumn, *originalSizeColumn, *savingsColumn, *bestToolColumn; 21 | 22 | QLPreviewPanel* previewPanel; 23 | 24 | dispatch_source_t statusBarUpdateQueue; 25 | IBOutlet NSNumberFormatter *savingsFormatter; 26 | } 27 | 28 | - (IBAction)showPrefs:(id)sender; 29 | - (IBAction)startAgain:(id)sender; 30 | - (IBAction)startAgainOptimized:(id)sender; 31 | - (IBAction)clearComplete:(id)sender; 32 | 33 | -(IBAction)quickLookAction:(id)sender; 34 | -(IBAction)openHomepage:(id)sender; 35 | -(IBAction)viewSource:(id)sender; 36 | -(IBAction)openDonationPage:(id)sender; 37 | -(IBAction)browseForFiles:(id)sender; 38 | 39 | @property (readonly) int numberOfCPUs; 40 | -(void)loadCreditsHTML; 41 | 42 | @property (unsafe_unretained, readonly) FilesQueue *filesQueue; 43 | @end 44 | -------------------------------------------------------------------------------- /imageoptim/ImageOptimVerbs.sdef: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /imageoptim/Makefile: -------------------------------------------------------------------------------- 1 | SPARKLE=$(TARGET_BUILD_DIR)/Sparkle.framework 2 | HELPINDEXES=$(addsuffix Help.helpindex, $(wildcard *.lproj/Help/)) 3 | 4 | all: $(SPARKLE) pngout helpindexes 5 | 6 | $(SPARKLE): 7 | ./getsparkle.sh $(SPARKLE) 8 | 9 | pngout: 10 | curl http://static.jonof.id.au/dl/kenutils/pngout-20130221-darwin.tar.gz | tar xz 11 | mv pngout-20130221-darwin/pngout pngout 12 | 13 | clean: 14 | -rm -rf $(SPARKLE) pngout /tmp/sparkle.zip /tmp/sparkle.tar.bz2 15 | 16 | install: 17 | 18 | helpindexes:: $(HELPINDEXES) 19 | 20 | %/Help.helpindex: %/index.html %/prefs.html 21 | ./makehelp.sh $(patsubst %.lproj/Help/Help.helpindex,%,$@) 22 | -------------------------------------------------------------------------------- /imageoptim/MyTableView.h: -------------------------------------------------------------------------------- 1 | /* MyTableView */ 2 | 3 | #import 4 | 5 | @class RevealButtonCell; 6 | 7 | @interface MyTableView : NSTableView 8 | { 9 | NSInteger iMouseRow, iMouseCol; 10 | RevealButtonCell *iMouseCell; 11 | } 12 | - (IBAction)delete:(id)sender; 13 | - (IBAction)copyAsDataURI:(id)sender; 14 | 15 | -(IBAction)openInFinder:(id)sender; 16 | @end 17 | -------------------------------------------------------------------------------- /imageoptim/PrefsController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PrefsController.h 3 | // 4 | // Created by porneL on 24.wrz.07. 5 | // 6 | 7 | #import 8 | @class ImageOptimController; 9 | 10 | @interface PrefsController : NSWindowController { 11 | } 12 | 13 | -(IBAction)showHelp:(id)sender; 14 | @end 15 | -------------------------------------------------------------------------------- /imageoptim/PrefsController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PrefsController.m 3 | // 4 | // Created by porneL on 24.wrz.07. 5 | // 6 | 7 | #import "PrefsController.h" 8 | #import "ImageOptimController.h" 9 | #import "Transformers.h" 10 | 11 | @implementation PrefsController 12 | 13 | -(instancetype)init { 14 | if ((self = [super initWithWindowNibName:@"PrefsController"])) { 15 | CeilFormatter *cf = [CeilFormatter new]; 16 | [NSValueTransformer setValueTransformer:cf forName:@"CeilFormatter"]; 17 | 18 | DisabledColor *dc = [DisabledColor new]; 19 | [NSValueTransformer setValueTransformer:dc forName:@"DisabledColor"]; 20 | } 21 | return self; 22 | } 23 | 24 | -(IBAction)showHelp:(id)sender { 25 | NSInteger tag = [sender tag]; 26 | 27 | [[self window] setHidesOnDeactivate:NO]; 28 | 29 | NSString *locBookName = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleHelpBookName"]; 30 | NSString *anchors[] = {@"general", @"jpegoptim", @"advpng", @"optipng", @"pngcrush", @"pngout"}; 31 | NSString *anchor = @"main"; 32 | 33 | if (tag >= 1 && tag <= 6) { 34 | anchor = anchors[tag-1]; 35 | } 36 | [[NSHelpManager sharedHelpManager] openHelpAnchor:anchor inBook:locBookName]; 37 | } 38 | @end 39 | -------------------------------------------------------------------------------- /imageoptim/ResultsDb.h: -------------------------------------------------------------------------------- 1 | 2 | #import 3 | 4 | @interface ResultsDb : NSObject { 5 | } 6 | -(BOOL)hasResultWithFileSize:(NSUInteger)size; 7 | -(BOOL)getResultWithHash:(uint32_t[static 4])hash; 8 | -(void)setUnoptimizableFileHash:(uint32_t[static 4])inputFileHash size:(NSUInteger)byteSizeOnDisk; 9 | @end 10 | -------------------------------------------------------------------------------- /imageoptim/ResultsDb.m: -------------------------------------------------------------------------------- 1 | 2 | #import "ResultsDb.h" 3 | #import "log.h" 4 | #include 5 | 6 | @implementation ResultsDb { 7 | sqlite3 *db; 8 | dispatch_queue_t sqlitequeue; 9 | } 10 | 11 | typedef BOOL (^rowcallback)(int numColumns, char **values, char **columnNames); 12 | 13 | - (instancetype)init 14 | { 15 | if ((self = [super init])) { 16 | NSURL *cachesPath = [[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil]; 17 | cachesPath = [cachesPath URLByAppendingPathComponent:@"ImageOptimResults.db"]; 18 | IODebug(@"Results cache is in %@", cachesPath.path); 19 | if (SQLITE_OK != sqlite3_open([cachesPath.path fileSystemRepresentation], &db)) { 20 | IOWarn(@"Failed to open db: %s", sqlite3_errmsg(db)); 21 | sqlite3_close(db); 22 | db = NULL; 23 | return nil; 24 | } 25 | sqlitequeue = dispatch_queue_create("imageoptim sqlite", DISPATCH_QUEUE_SERIAL); 26 | dispatch_async(sqlitequeue, ^(){ 27 | char *err; 28 | if (SQLITE_OK != sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS results(inputs_hashsh BLOB(16) NOT NULL PRIMARY KEY, size INT NOT NULL, status INT NOT NULL DEFAULT 0);" 29 | "CREATE INDEX IF NOT EXISTS results_size ON results(size)", NULL, NULL, &err)) { 30 | IOWarn(@"Failed to create tables: %s", err); 31 | sqlite3_free(err); 32 | } 33 | }); 34 | } 35 | return self; 36 | } 37 | 38 | -(void)dealloc { 39 | if (db) { 40 | sqlite3 *dbtmp = db; 41 | dispatch_sync(sqlitequeue, ^(){ 42 | sqlite3_close(dbtmp); 43 | }); 44 | } 45 | dispatch_release(sqlitequeue); 46 | } 47 | 48 | -(void)setUnoptimizableFileHash:(uint32_t[static 4])hash size:(NSUInteger)byteSizeOnDisk { 49 | assert(hash[0]||hash[1]||hash[2]||hash[3]); 50 | 51 | [self runQuery:[NSString stringWithFormat:@"INSERT INTO results(inputs_hashsh, size, status) VALUES(x'%08x%08x%08x%08x', %lu, 1)", hash[0],hash[1],hash[2],hash[3], byteSizeOnDisk] withBlock:nil]; 52 | } 53 | 54 | -(BOOL)getResultWithHash:(uint32_t[static 4])hash { 55 | assert(hash[0]||hash[1]||hash[2]||hash[3]); 56 | 57 | BOOL __block found = NO; 58 | [self runQuery:[NSString stringWithFormat:@"SELECT 1 FROM results WHERE inputs_hashsh = x'%08x%08x%08x%08x' LIMIT 1", hash[0],hash[1],hash[2],hash[3]] withBlock:^BOOL(int c, char**a, char**b){ 59 | found = YES; 60 | return YES; 61 | }]; 62 | return found; 63 | } 64 | 65 | -(BOOL)hasResultWithFileSize:(NSUInteger)size { 66 | BOOL __block found = NO; 67 | [self runQuery:[NSString stringWithFormat:@"SELECT 1 FROM results WHERE size = %lu LIMIT 1", (long)size] withBlock:^BOOL(int c, char**a, char**b){ 68 | found = YES; 69 | return YES; 70 | }]; 71 | return found; 72 | } 73 | 74 | static int invokeBlockCallback(void *blockp, int numColumns, char **values, char **columnNames){ 75 | rowcallback b = (__bridge rowcallback)blockp; 76 | return !b(numColumns, values, columnNames); 77 | } 78 | 79 | -(BOOL)runQuery:(NSString*)query withBlock:(rowcallback)block { 80 | BOOL __block res = YES; 81 | dispatch_sync(sqlitequeue, ^(){ 82 | char *err; 83 | if (SQLITE_OK != sqlite3_exec(db, [query UTF8String], block ? invokeBlockCallback : NULL, (__bridge void*)block, &err)) { 84 | IOWarn(@"Query failed: %s in %@", err, query); 85 | sqlite3_free(err); 86 | res = NO; 87 | } 88 | }); 89 | return res; 90 | } 91 | 92 | @end 93 | -------------------------------------------------------------------------------- /imageoptim/RevealButtonCell.h: -------------------------------------------------------------------------------- 1 | 2 | #import 3 | 4 | @interface RevealButtonCell : NSTextFieldCell { 5 | @private 6 | BOOL iMouseDownInInfoButton; 7 | BOOL iMouseHoveredInInfoButton; 8 | SEL iInfoButtonAction; 9 | } 10 | @property SEL infoButtonAction; 11 | 12 | - (NSRect)infoButtonRectForBounds:(NSRect)bounds; 13 | 14 | - (void)addTrackingAreasForView:(NSView *)controlView inRect:(NSRect)cellFrame withUserInfo:(NSDictionary *)userInfo mouseLocation:(NSPoint)mouseLocation; 15 | 16 | - (void)setMouseEntered:(BOOL)y; 17 | @end 18 | -------------------------------------------------------------------------------- /imageoptim/SavingsFormatter.h: -------------------------------------------------------------------------------- 1 | // 2 | // SavingsFormatter.h 3 | // ImageOptim 4 | // 5 | // 6 | 7 | #import 8 | 9 | @interface SavingsFormatter : NSNumberFormatter 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /imageoptim/SavingsFormatter.m: -------------------------------------------------------------------------------- 1 | // 2 | // SavingsFormatter.m 3 | // ImageOptim 4 | // 5 | // 6 | 7 | #import "SavingsFormatter.h" 8 | 9 | @implementation SavingsFormatter 10 | 11 | - (NSString *)stringForObjectValue:(id)anObject { 12 | double val = [anObject doubleValue]; 13 | 14 | if (val < 0) return @""; 15 | if (val < 1.0/1024.0) { 16 | return @"0%"; 17 | } 18 | return [super stringForObjectValue:anObject]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /imageoptim/Transformers.h: -------------------------------------------------------------------------------- 1 | // 2 | // CeilFormatter.h 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import 8 | 9 | 10 | @interface CeilFormatter : NSValueTransformer { 11 | 12 | } 13 | 14 | @end 15 | 16 | @interface DisabledColor : NSValueTransformer { 17 | 18 | } 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /imageoptim/Transformers.m: -------------------------------------------------------------------------------- 1 | // 2 | // CeilFormatter.m 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import "Transformers.h" 8 | 9 | 10 | @implementation CeilFormatter 11 | 12 | + (Class)transformedValueClass; 13 | { 14 | return [NSNumber class]; 15 | } 16 | 17 | - (id)transformedValue:(id)value; 18 | { 19 | double v = 1.0; 20 | if ([value respondsToSelector: @selector(doubleValue)]) { 21 | v = MAX(1.0F,ceil([value doubleValue])); 22 | } 23 | return @(v); 24 | } 25 | @end 26 | 27 | 28 | @implementation DisabledColor 29 | 30 | + (Class)transformedValueClass; 31 | { 32 | return [NSColor class]; 33 | } 34 | 35 | - (id)transformedValue:(id)value; 36 | { 37 | if ([value respondsToSelector: @selector(boolValue)] && ![value boolValue]) { 38 | return [NSColor disabledControlTextColor]; 39 | } 40 | return [NSColor textColor]; 41 | } 42 | @end 43 | -------------------------------------------------------------------------------- /imageoptim/Workers/AdvCompWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // AdvCompWorker.h 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import 8 | #import "CommandWorker.h" 9 | 10 | @interface AdvCompWorker : CommandWorker { 11 | NSInteger level; 12 | 13 | NSInteger fileSizeOptimized; 14 | } 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /imageoptim/Workers/AdvCompWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // AdvCompWorker.m 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import "AdvCompWorker.h" 8 | #import "../File.h" 9 | #import "../log.h" 10 | 11 | @implementation AdvCompWorker 12 | 13 | -(instancetype)init { 14 | if (self = [super init]) { 15 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 16 | level = [defaults integerForKey:@"AdvPngLevel"]; 17 | 18 | } 19 | return self; 20 | } 21 | 22 | -(NSInteger)settingsIdentifier { 23 | return level; 24 | } 25 | 26 | -(BOOL)runWithTempPath:(NSURL *)temp { 27 | NSFileManager *fm = [NSFileManager defaultManager]; 28 | NSError *error = nil; 29 | 30 | if (![fm copyItemAtURL:file.filePathOptimized toURL:temp error:&error]) { 31 | IOWarn("Can't make temp copy of %@ in %@; %@",file.filePathOptimized.path,temp.path,error); 32 | return NO; 33 | } 34 | 35 | if (![self taskForKey:@"AdvPng" bundleName:@"advpng" 36 | arguments:@[[NSString stringWithFormat:@"-%d",(int)(level ? level : 4)],@"-z",@"--",temp.path]]) { 37 | return NO; 38 | } 39 | 40 | NSPipe *commandPipe = [NSPipe pipe]; 41 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 42 | 43 | [task setStandardOutput: commandPipe]; 44 | [task setStandardError: commandPipe]; 45 | 46 | [self launchTask]; 47 | 48 | [self parseLinesFromHandle:commandHandle]; 49 | [task waitUntilExit]; 50 | 51 | [commandHandle closeFile]; 52 | 53 | if ([task terminationStatus]) return NO; 54 | 55 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:@"AdvPNG"]; 56 | } 57 | 58 | -(BOOL)parseLine:(NSString *)line { 59 | NSScanner *scan = [NSScanner scannerWithString:line]; 60 | 61 | int original,optimized; 62 | 63 | if ([scan scanInt:&original] && [scan scanInt:&optimized]) { 64 | fileSizeOptimized = optimized; 65 | return YES; 66 | } 67 | return NO; 68 | } 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /imageoptim/Workers/CommandWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // Worker.h 3 | // 4 | // Created by porneL on 23.wrz.07. 5 | // 6 | 7 | #import 8 | #import "Worker.h" 9 | #import "../File.h" 10 | 11 | @interface CommandWorker : Worker { 12 | NSTask *task; 13 | } 14 | 15 | 16 | -(BOOL)parseLine:(NSString *)line; 17 | -(void)parseLinesFromHandle:(NSFileHandle *)commandHandle; 18 | 19 | -(void)taskWithPath:(NSString*)path arguments:(NSArray *)arguments; 20 | 21 | 22 | -(long)readNumberAfter:(NSString *)str inLine:(NSString *)line; 23 | 24 | -(void)launchTask; 25 | 26 | -(NSString *)executablePathForKey:(NSString *)prefsName bundleName:(NSString *)resourceName; 27 | 28 | -(BOOL)taskForKey:(NSString *)key bundleName:(NSString *)resourceName arguments:(NSArray *)args; 29 | 30 | -(BOOL)runWithTempPath:(NSURL*)tempPath; 31 | 32 | -(NSURL *)tempPath; 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /imageoptim/Workers/DirWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // DirWorker.h 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import 8 | 9 | @class FilesQueue; 10 | 11 | @interface DirWorker : NSOperation { 12 | FilesQueue *filesQueue; 13 | NSURL *path; 14 | NSArray *extensions; 15 | } 16 | 17 | -(instancetype)initWithPath:(NSURL *)path filesQueue:(FilesQueue *)q extensions:(NSArray*)e; 18 | 19 | @property (copy) NSURL *path; 20 | @end 21 | -------------------------------------------------------------------------------- /imageoptim/Workers/DirWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // DirWorker.m 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import "DirWorker.h" 8 | #import "../FilesQueue.h" 9 | #import "../log.h" 10 | 11 | @implementation DirWorker 12 | 13 | 14 | @synthesize path; 15 | 16 | -(instancetype)initWithPath:(NSURL *)aPath filesQueue:(FilesQueue *)q extensions:(NSArray *)theExtensions { 17 | if (self = [super init]) { 18 | self.path = aPath; 19 | filesQueue = q; 20 | extensions = theExtensions; 21 | } 22 | return self; 23 | } 24 | 25 | -(void)main { 26 | const NSUInteger buffer_capacity = 256; 27 | NSUInteger buffer_size = 16; 28 | NSMutableArray *buffer = [NSMutableArray arrayWithCapacity:buffer_capacity]; 29 | 30 | @try { 31 | for (NSURL *newPath in [[NSFileManager defaultManager] enumeratorAtURL:path 32 | includingPropertiesForKeys:@[] 33 | options:0 34 | errorHandler:nil]) { 35 | if ([extensions containsObject:[newPath pathExtension]]) { 36 | [buffer addObject:newPath]; 37 | if ([buffer count] >= buffer_size) { 38 | // assuming that previous buffer flushes created some work to do 39 | // buffer size can be increased to lower overhead 40 | buffer_size = MIN(buffer_capacity, buffer_size*4); 41 | [filesQueue addURLs:buffer filesOnly:YES]; 42 | [buffer removeAllObjects]; 43 | } 44 | } 45 | } 46 | 47 | if ([buffer count]) [filesQueue addURLs:buffer filesOnly:YES]; 48 | } 49 | @catch (NSException *ex) { 50 | IOWarn("DIR worker failed %@",ex); 51 | } 52 | } 53 | 54 | -(NSString *)description { 55 | return [NSString stringWithFormat:@"Dir %@ (%@)",path,[super description]]; 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /imageoptim/Workers/GifsicleWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // AdvCompWorker.h 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import 8 | #import "CommandWorker.h" 9 | 10 | @interface GifsicleWorker : CommandWorker { 11 | BOOL interlace; 12 | } 13 | 14 | @property (nonatomic,assign) BOOL interlace; 15 | @end 16 | -------------------------------------------------------------------------------- /imageoptim/Workers/GifsicleWorker.m: -------------------------------------------------------------------------------- 1 | 2 | #import "GifsicleWorker.h" 3 | #import "../File.h" 4 | 5 | @implementation GifsicleWorker 6 | 7 | @synthesize interlace; 8 | 9 | -(NSInteger)settingsIdentifier { 10 | return interlace; 11 | } 12 | 13 | -(BOOL)runWithTempPath:(NSURL *)temp { 14 | NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-o",temp.path, 15 | interlace ? @"--interlace" : @"--no-interlace", 16 | @"-O3", 17 | @"--careful",/* needed for Safari/Preview decoding bug */ 18 | @"--no-comments",@"--no-names",@"--same-delay",@"--same-loopcount",@"--no-warnings", 19 | @"--",file.filePathOptimized.path,nil]; 20 | 21 | if (![self taskForKey:@"Gifsicle" bundleName:@"gifsicle" arguments:args]) { 22 | return NO; 23 | } 24 | 25 | NSFileHandle *devnull = [NSFileHandle fileHandleWithNullDevice]; 26 | 27 | [task setStandardInput: devnull]; 28 | [task setStandardError: devnull]; 29 | [task setStandardOutput: devnull]; 30 | 31 | [self launchTask]; 32 | [task waitUntilExit]; 33 | 34 | [devnull closeFile]; 35 | 36 | if ([task terminationStatus]) return NO; 37 | 38 | NSUInteger fileSizeOptimized = [File fileByteSize:temp]; 39 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:interlace ? @"Gifsicle interlaced" : @"Gifsicle"]; 40 | } 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /imageoptim/Workers/JpegoptimWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // JpegoptimWorker.h 3 | // 4 | // Created by porneL on 7.paź.07. 5 | // 6 | 7 | #import 8 | #import "CommandWorker.h" 9 | 10 | @interface JpegoptimWorker : CommandWorker { 11 | NSInteger maxquality; 12 | NSInteger fileSizeOptimized; 13 | BOOL strip; 14 | } 15 | @end 16 | -------------------------------------------------------------------------------- /imageoptim/Workers/JpegoptimWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // JpegoptimWorker.m 3 | // 4 | // Created by porneL on 7.paź.07. 5 | // 6 | 7 | #import "JpegoptimWorker.h" 8 | #import "../File.h" 9 | #import "../log.h" 10 | 11 | @implementation JpegoptimWorker 12 | 13 | -(NSInteger)settingsIdentifier { 14 | return maxquality*2 + strip; 15 | } 16 | 17 | -(instancetype)initWithFile:(File *)aFile { 18 | if (self = [super initWithFile:aFile]) { 19 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 20 | 21 | // Sharing setting with jpegtran 22 | strip = [defaults boolForKey:@"JpegTranStripAll"]; 23 | 24 | maxquality = [defaults integerForKey:@"JpegOptimMaxQuality"]; 25 | } 26 | return self; 27 | } 28 | 29 | -(BOOL)makesNonOptimizingModifications { 30 | return maxquality < 100; 31 | } 32 | 33 | -(BOOL)runWithTempPath:(NSURL *)temp { 34 | NSFileManager *fm = [NSFileManager defaultManager]; 35 | NSError *error = nil; 36 | 37 | if (![fm copyItemAtURL:file.filePathOptimized toURL:temp error:&error]) { 38 | IOWarn("Can't make temp copy of %@ in %@", file.filePathOptimized.path, temp.path); 39 | } 40 | 41 | NSMutableArray *args = [NSMutableArray arrayWithObjects: @"-q",@"--",temp.path,nil]; 42 | 43 | 44 | if (strip) { 45 | [args insertObject:@"--strip-all" atIndex:0]; 46 | } 47 | 48 | if (maxquality > 10 && maxquality < 100) { 49 | [args insertObject:[NSString stringWithFormat:@"-m%d",(int)maxquality] atIndex:0]; 50 | } 51 | 52 | if (![self taskForKey:@"JpegOptim" bundleName:@"jpegoptim" arguments:args]) { 53 | return NO; 54 | } 55 | 56 | NSPipe *commandPipe = [NSPipe pipe]; 57 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 58 | 59 | [task setStandardOutput: commandPipe]; 60 | [task setStandardError: commandPipe]; 61 | 62 | [self launchTask]; 63 | 64 | [self parseLinesFromHandle:commandHandle]; 65 | [task waitUntilExit]; 66 | 67 | [commandHandle closeFile]; 68 | 69 | BOOL isSignificantlySmaller; 70 | @synchronized(file) { 71 | // require at least 5% gain when doing lossy optimization 72 | isSignificantlySmaller = file.byteSizeOptimized*0.95 > fileSizeOptimized; 73 | } 74 | 75 | if (![self makesNonOptimizingModifications] || isSignificantlySmaller) { 76 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:@"JpegOptim"]; 77 | } 78 | return NO; 79 | } 80 | 81 | -(BOOL)parseLine:(NSString *)line { 82 | NSInteger size; 83 | if ((size = [self readNumberAfter:@" --> " inLine:line])) { 84 | fileSizeOptimized = size; 85 | return YES; 86 | } 87 | return NO; 88 | } 89 | 90 | 91 | @end 92 | -------------------------------------------------------------------------------- /imageoptim/Workers/JpegtranWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // JpegoptimWorker.h 3 | // 4 | // Created by porneL on 7.paź.07. 5 | // 6 | 7 | #import 8 | #import "CommandWorker.h" 9 | 10 | @interface JpegtranWorker : CommandWorker { 11 | BOOL strip, jpegrescan; 12 | } 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /imageoptim/Workers/JpegtranWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // JpegtranWorker.m 3 | // 4 | // Created by porneL on 7.paź.07. 5 | // 6 | 7 | #import "JpegtranWorker.h" 8 | #import "../File.h" 9 | 10 | @implementation JpegtranWorker 11 | 12 | -(NSInteger)settingsIdentifier { 13 | return @(jpegrescan*2+strip); 14 | } 15 | 16 | -(instancetype)initWithFile:(File *)aFile { 17 | if (self = [super initWithFile:aFile]) { 18 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 19 | strip = [defaults boolForKey:@"JpegTranStripAll"]; 20 | 21 | jpegrescan = [defaults boolForKey:@"JpegRescanEnabled"]; 22 | } 23 | return self; 24 | } 25 | 26 | -(BOOL)runWithTempPath:(NSURL *)temp { 27 | // eh, handling of paths starting with "-" is unsafe here. Hopefully all paths from dropped files will be absolute... 28 | NSMutableArray *args = [NSMutableArray arrayWithObject:file.filePathOptimized.path]; 29 | NSString *executableName, *prefName; 30 | 31 | if (jpegrescan) { 32 | executableName = @"jpegrescan"; 33 | prefName = @"JpegRescan"; 34 | if (strip) { 35 | [args insertObject:@"-s" atIndex:0]; 36 | } 37 | [args addObject:temp.path]; 38 | } else { 39 | executableName = @"jpegtran"; 40 | prefName = @"JpegTran"; 41 | [args insertObject:@"-outfile" atIndex:0]; 42 | [args insertObject:temp.path atIndex:1]; 43 | 44 | [args insertObject:@"-optimize" atIndex:0]; 45 | [args insertObject:@"-copy" atIndex:0]; 46 | [args insertObject:strip ? @"none" : @"all" atIndex:1]; 47 | } 48 | 49 | // For jpegrescan to work both JpegTran and JpegRescan need to be enabled 50 | if (![self taskForKey:prefName bundleName:executableName arguments:args]) { 51 | return NO; 52 | } 53 | 54 | [task setCurrentDirectoryPath:[[[NSBundle mainBundle] pathForAuxiliaryExecutable:@"jpegtran"] stringByDeletingLastPathComponent]]; 55 | 56 | NSPipe *commandPipe = [NSPipe pipe]; 57 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 58 | 59 | [task setStandardOutput: commandPipe]; 60 | [task setStandardError: commandPipe]; 61 | 62 | [self launchTask]; 63 | 64 | [commandHandle readToEndOfFileInBackgroundAndNotify]; 65 | [task waitUntilExit]; 66 | 67 | [commandHandle closeFile]; 68 | 69 | if ([task terminationStatus]) return NO; 70 | 71 | NSUInteger fileSizeOptimized = [File fileByteSize:temp]; 72 | if (fileSizeOptimized) { 73 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:executableName]; 74 | } 75 | return NO; 76 | } 77 | 78 | -(BOOL)parseLine:(NSString *)line { 79 | NSRange substr = [line rangeOfString:@"End Of Image"]; 80 | if (substr.length) { 81 | return YES; 82 | } 83 | return NO; 84 | } 85 | 86 | 87 | @end 88 | -------------------------------------------------------------------------------- /imageoptim/Workers/OptiPngWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // AdvCompWorker.h 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import 8 | #import "CommandWorker.h" 9 | 10 | @interface OptiPngWorker : CommandWorker { 11 | NSInteger optlevel, interlace; 12 | 13 | 14 | NSInteger idatSize; 15 | NSUInteger fileSize; 16 | NSUInteger fileSizeOptimized; 17 | } 18 | @end 19 | -------------------------------------------------------------------------------- /imageoptim/Workers/OptiPngWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // AdvCompWorker.m 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import "OptiPngWorker.h" 8 | #import "../File.h" 9 | 10 | @implementation OptiPngWorker 11 | 12 | -(instancetype)init { 13 | if (self = [super init]) { 14 | NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; 15 | optlevel = [defs integerForKey:@"OptiPngLevel"]; 16 | interlace = [defs integerForKey:@"OptiPngInterlace"]; 17 | 18 | } 19 | return self; 20 | } 21 | 22 | 23 | -(NSInteger)settingsIdentifier { 24 | return optlevel*2 + interlace; 25 | } 26 | 27 | -(BOOL)runWithTempPath:(NSURL *)temp { 28 | NSMutableArray *args = [NSMutableArray arrayWithObjects: [NSString stringWithFormat:@"-o%d",(int)(optlevel ? optlevel : 6)], 29 | @"-out",temp.path,@"--",file.filePathOptimized.path,nil]; 30 | 31 | if (interlace != -1) { 32 | [args insertObject:[NSString stringWithFormat:@"-i%d",(int)interlace] atIndex:0]; 33 | } 34 | 35 | if (![self taskForKey:@"OptiPng" bundleName:@"optipng" arguments:args]) { 36 | return NO; 37 | } 38 | 39 | NSPipe *commandPipe = [NSPipe pipe]; 40 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 41 | 42 | [task setStandardError: commandPipe]; 43 | [task setStandardOutput: commandPipe]; 44 | 45 | [self launchTask]; 46 | 47 | [self parseLinesFromHandle:commandHandle]; 48 | 49 | [task waitUntilExit]; 50 | [commandHandle closeFile]; 51 | 52 | if ([task terminationStatus]) return NO; 53 | 54 | if (fileSizeOptimized) { 55 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:@"OptiPNG"]; 56 | } 57 | return NO; 58 | } 59 | 60 | -(BOOL)parseLine:(NSString *)line { 61 | NSUInteger res; 62 | 63 | if ([line length] > 20) { 64 | if ((res = [self readNumberAfter:@"Output file size = " inLine:line])) { 65 | fileSizeOptimized = res; 66 | return YES; 67 | } 68 | } 69 | return NO; 70 | } 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /imageoptim/Workers/PngCrushWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // PngCrushWorker.h 3 | // 4 | // Created by porneL on 1.paź.07. 5 | // 6 | 7 | #import 8 | #import "CommandWorker.h" 9 | 10 | @interface PngCrushWorker : CommandWorker { 11 | int firstIdatSize; 12 | BOOL strip; 13 | } 14 | 15 | @property (readonly) BOOL makesNonOptimizingModifications; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /imageoptim/Workers/PngCrushWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // PngCrushWorker.m 3 | // 4 | // Created by porneL on 1.paź.07. 5 | // 6 | 7 | #import "PngCrushWorker.h" 8 | 9 | 10 | @implementation PngCrushWorker 11 | - (instancetype)init { 12 | if ((self = [super init])) { 13 | strip = [[NSUserDefaults standardUserDefaults] boolForKey:@"PngOutRemoveChunks"]; 14 | } 15 | return self; 16 | } 17 | 18 | -(NSInteger)settingsIdentifier { 19 | return strip; 20 | } 21 | 22 | -(BOOL)runWithTempPath:(NSURL *)temp { 23 | NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-nofilecheck",@"-bail",@"-blacken",@"-reduce",@"-cc",@"--",file.filePathOptimized.path,temp.path,nil]; 24 | 25 | // Reusing PngOut config here 26 | if (strip) { 27 | [args insertObject:@"-rem" atIndex:0]; 28 | [args insertObject:@"alla" atIndex:1]; 29 | } 30 | 31 | if ([file isSmall]) { 32 | [args insertObject:@"-brute" atIndex:0]; 33 | } 34 | 35 | if (![self taskForKey:@"PngCrush" bundleName:@"pngcrush" arguments:args]) { 36 | return NO; 37 | } 38 | 39 | NSPipe *commandPipe = [NSPipe pipe]; 40 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 41 | 42 | [task setStandardOutput: commandPipe]; 43 | [task setStandardError: commandPipe]; 44 | 45 | [self launchTask]; 46 | 47 | [commandHandle readToEndOfFileInBackgroundAndNotify]; 48 | 49 | [task waitUntilExit]; 50 | 51 | [commandHandle closeFile]; 52 | 53 | if ([task terminationStatus]) return NO; 54 | 55 | NSUInteger fileSizeOptimized; 56 | // pngcrush sometimes writes only PNG header (70 bytes)! 57 | if ((fileSizeOptimized = [File fileByteSize:temp]) && fileSizeOptimized > 70) { 58 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:@"Pngcrush"]; 59 | } 60 | return NO; 61 | } 62 | 63 | -(BOOL)makesNonOptimizingModifications { 64 | return strip; 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /imageoptim/Workers/PngQuantWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // PngQuantWorker.h 3 | // ImageOptim 4 | // 5 | // Created by John Wong on 2/17/15. 6 | // 7 | // 8 | 9 | #import "CommandWorker.h" 10 | 11 | @interface PngQuantWorker : CommandWorker 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /imageoptim/Workers/PngQuantWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // PngQuantWorker.m 3 | // ImageOptim 4 | // 5 | // Created by John Wong on 2/17/15. 6 | // 7 | // 8 | 9 | #import "PngQuantWorker.h" 10 | 11 | @implementation PngQuantWorker 12 | 13 | - (instancetype)init { 14 | if ((self = [super init])) { 15 | 16 | } 17 | return self; 18 | } 19 | 20 | -(NSInteger)settingsIdentifier { 21 | return 1; 22 | } 23 | 24 | -(BOOL)runWithTempPath:(NSURL *)temp { 25 | NSMutableArray *args = [NSMutableArray arrayWithObjects:@"--force",@"--nofs",@"--output",temp.path,file.filePathOptimized.path,nil]; 26 | 27 | if (![self taskForKey:@"PngQuant" bundleName:@"pngquant" arguments:args]) { 28 | return NO; 29 | } 30 | 31 | NSPipe *commandPipe = [NSPipe pipe]; 32 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 33 | 34 | [task setStandardOutput: commandPipe]; 35 | [task setStandardError: commandPipe]; 36 | 37 | [self launchTask]; 38 | 39 | [commandHandle readToEndOfFileInBackgroundAndNotify]; 40 | 41 | [task waitUntilExit]; 42 | 43 | [commandHandle closeFile]; 44 | 45 | if ([task terminationStatus]) return NO; 46 | NSInteger fileSizeOptimized = [File fileByteSize:temp]; 47 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:@"PngQuant"]; 48 | 49 | return YES; 50 | } 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /imageoptim/Workers/PngoutWorker.h: -------------------------------------------------------------------------------- 1 | // 2 | // PngoutWorker.h 3 | // 4 | // Created by porneL on 29.wrz.07. 5 | // 6 | 7 | #import 8 | #import "CommandWorker.h" 9 | 10 | @interface PngoutWorker : CommandWorker { 11 | BOOL removechunks, interruptIfTakesTooLong; 12 | NSInteger level; 13 | 14 | NSInteger fileSizeOptimized; 15 | } 16 | 17 | 18 | @property (readonly) BOOL makesNonOptimizingModifications; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /imageoptim/Workers/PngoutWorker.m: -------------------------------------------------------------------------------- 1 | // 2 | // PngoutWorker.m 3 | // ImageOptim 4 | // 5 | // Created by porneL on 29.wrz.07. 6 | // Copyright 2007 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import "PngoutWorker.h" 10 | #import "../File.h" 11 | #import "../log.h" 12 | 13 | @implementation PngoutWorker 14 | 15 | -(instancetype)init { 16 | if (self = [super init]) { 17 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 18 | level = 3-[defaults integerForKey:@"PngOutLevel"]; 19 | removechunks = [defaults boolForKey:@"PngOutRemoveChunks"]; 20 | interruptIfTakesTooLong = [defaults boolForKey:@"PngOutInterruptIfTakesTooLong"]; 21 | } 22 | return self; 23 | } 24 | 25 | -(NSInteger)settingsIdentifier { 26 | return level*4 + removechunks*2 + interruptIfTakesTooLong; 27 | } 28 | 29 | -(BOOL)runWithTempPath:(NSURL *)temp { 30 | // uses stdout for file to force progress output to unbufferred stderr 31 | NSMutableArray *args = [NSMutableArray arrayWithObjects: @"-v",/*@"--",*/file.filePathOptimized.path,@"-",nil]; 32 | 33 | [args insertObject:@"-r" atIndex:0]; 34 | 35 | int actualLevel = (int)level; 36 | if ([file isLarge] && level < 2) { 37 | actualLevel++; // use faster setting for large files 38 | } 39 | 40 | if (actualLevel) { // s0 is default 41 | [args insertObject:[NSString stringWithFormat:@"-s%d",actualLevel] atIndex:0]; 42 | } 43 | 44 | if (!removechunks) { // -k0 (remove) is default 45 | [args insertObject:@"-k1" atIndex:0]; 46 | } 47 | 48 | if (![self taskForKey:@"PngOut" bundleName:@"pngout" arguments:args]) { 49 | return NO; 50 | } 51 | 52 | NSError *err = nil; 53 | [[NSData new] writeToURL:temp atomically:NO]; 54 | NSFileHandle *fileOutputHandle = [NSFileHandle fileHandleForWritingToURL:temp error:&err]; 55 | 56 | if (!fileOutputHandle) { 57 | IOWarn("Can't create %@ %@",temp.path, err); 58 | return NO; 59 | } 60 | 61 | NSPipe *commandPipe = [NSPipe pipe]; 62 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 63 | 64 | [task setStandardOutput: fileOutputHandle]; 65 | [task setStandardError: commandPipe]; 66 | 67 | double timelimit = 10.0 + [file byteSizeOriginal]/1024.0; 68 | if (timelimit > 60.0) timelimit = 60.0; 69 | 70 | if (interruptIfTakesTooLong) [task performSelector:@selector(interrupt) withObject:nil afterDelay:timelimit]; 71 | [self launchTask]; 72 | 73 | [self parseLinesFromHandle:commandHandle]; 74 | 75 | if (interruptIfTakesTooLong) [NSObject cancelPreviousPerformRequestsWithTarget:task selector:@selector(interrupt) object:nil]; 76 | 77 | [task waitUntilExit]; 78 | [commandHandle closeFile]; 79 | [fileOutputHandle closeFile]; 80 | 81 | int status = [task terminationStatus]; // status = 2 early exit 82 | if (status && (status != 2 || !fileSizeOptimized)) { 83 | return NO; 84 | } 85 | 86 | if (fileSizeOptimized) { 87 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:@"PNGOUT"]; 88 | } 89 | return NO; 90 | } 91 | 92 | -(BOOL)makesNonOptimizingModifications { 93 | return removechunks; 94 | } 95 | 96 | -(BOOL)parseLine:(NSString *)line { 97 | // run PNGOUT killing timer 98 | [[NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode]; 99 | 100 | NSScanner *scan = [NSScanner scannerWithString:line]; 101 | 102 | if ([line length] > 4 && [[line substringToIndex:4] isEqual:@"Out:"]) { 103 | [scan setScanLocation:4]; 104 | int byteSize=0; 105 | if ([scan scanInt:&byteSize] && byteSize) { 106 | fileSizeOptimized = byteSize; 107 | } 108 | } else if ([line length] >= 3 && [line characterAtIndex:2] == '%') { 109 | } else if ([line length] >= 4 && [[line substringToIndex:4] isEqual:@"Took"]) { 110 | return YES; 111 | } 112 | return NO; 113 | } 114 | 115 | @end 116 | -------------------------------------------------------------------------------- /imageoptim/Workers/Worker.h: -------------------------------------------------------------------------------- 1 | // 2 | // Worker.h 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import 8 | 9 | 10 | @class Worker; 11 | @class File; 12 | 13 | @interface Worker : NSOperation { 14 | NSOperation *nextOperation; 15 | File *file; 16 | int fileType; 17 | } 18 | 19 | // nextOperation will make given operation high priority after this one finishes, 20 | // which can be used to cause domino effect and process operations in order for each file 21 | // as long as there are more queued operations than processing threads. 22 | @property (atomic,strong) NSOperation *nextOperation; 23 | @property (atomic, strong) File *file; 24 | 25 | -(instancetype)initWithFile:(File *)aFile; 26 | 27 | -(BOOL)isRelatedTo:(File *)f; 28 | 29 | @property (readonly) BOOL makesNonOptimizingModifications; 30 | 31 | -(void)run; 32 | 33 | @property (readonly) NSInteger settingsIdentifier; 34 | @property (getter=isIdempotent, readonly) BOOL idempotent; 35 | @end 36 | -------------------------------------------------------------------------------- /imageoptim/Workers/Worker.m: -------------------------------------------------------------------------------- 1 | // 2 | // Worker.m 3 | // 4 | // Created by porneL on 30.wrz.07. 5 | // 6 | 7 | #import "Worker.h" 8 | #import "File.h" 9 | #import "log.h" 10 | 11 | @implementation Worker 12 | 13 | @synthesize file, nextOperation; 14 | 15 | -(NSInteger)settingsIdentifier { 16 | return 0; 17 | } 18 | 19 | -(instancetype)initWithFile:(File *)aFile { 20 | if (self = [self init]) { 21 | self.file = aFile; 22 | } 23 | return self; 24 | } 25 | 26 | -(BOOL)isRelatedTo:(File *)f { 27 | return (f == file); 28 | } 29 | 30 | -(BOOL)canSkip { 31 | 32 | if (![self isIdempotent]) return NO; 33 | 34 | NSDictionary *resultsBySettings; 35 | @synchronized(file) { 36 | resultsBySettings = (file.workersPreviousResults)[[self className]]; 37 | } 38 | if (!resultsBySettings) return NO; 39 | 40 | NSNumber *previousResult = resultsBySettings[@([self settingsIdentifier])]; 41 | if (!previousResult) return NO; 42 | 43 | return file.byteSizeOptimized == [previousResult integerValue]; 44 | } 45 | 46 | -(void)markResultForSkipping { 47 | @synchronized(file) { 48 | NSMutableDictionary *resultsBySettings = (file.workersPreviousResults)[[self className]]; 49 | if (!resultsBySettings) { 50 | resultsBySettings = [NSMutableDictionary new]; 51 | (file.workersPreviousResults)[[self className]] = resultsBySettings; 52 | } 53 | resultsBySettings[@([self settingsIdentifier])] = @(file.byteSizeOptimized); 54 | } 55 | } 56 | 57 | -(void)main { 58 | [file updateStatusOfWorker:self running:YES]; 59 | 60 | @try { 61 | if (![self isCancelled]) { 62 | if (![self canSkip]) { 63 | [self run]; 64 | if (![self isCancelled]) [self markResultForSkipping]; 65 | } else { 66 | IODebug("Skipping %@, because it already optimized %@", [self className], file.fileName); 67 | } 68 | } 69 | } 70 | @finally { 71 | if (![self isCancelled]) { 72 | [nextOperation setQueuePriority:NSOperationQueuePriorityVeryHigh]; 73 | } 74 | [file updateStatusOfWorker:self running:NO]; 75 | } 76 | } 77 | 78 | -(void)run { 79 | } 80 | 81 | -(BOOL)isIdempotent { 82 | return YES; 83 | } 84 | 85 | -(BOOL)makesNonOptimizingModifications { 86 | return NO; 87 | } 88 | 89 | -(NSString *)description { 90 | return [NSString stringWithFormat:@"%@ %X ready %d, running %d, deleg %@", 91 | [self className],(unsigned int)[self hash],[self isReady],[self isExecuting],file]; 92 | } 93 | 94 | @end 95 | -------------------------------------------------------------------------------- /imageoptim/Workers/ZopfliWorker.h: -------------------------------------------------------------------------------- 1 | 2 | #import "CommandWorker.h" 3 | 4 | @interface ZopfliWorker : CommandWorker { 5 | int iterations; 6 | BOOL strip, alternativeStrategy; 7 | } 8 | 9 | @property (atomic, assign) BOOL alternativeStrategy; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /imageoptim/Workers/ZopfliWorker.m: -------------------------------------------------------------------------------- 1 | 2 | #import "ZopfliWorker.h" 3 | #import "../File.h" 4 | 5 | @implementation ZopfliWorker 6 | 7 | @synthesize alternativeStrategy; 8 | 9 | -(instancetype)init { 10 | if (self = [super init]) { 11 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 12 | iterations = (int)[defaults integerForKey:@"ZopfliIterations"]; 13 | strip = [[NSUserDefaults standardUserDefaults] boolForKey:@"PngOutRemoveChunks"]; 14 | } 15 | return self; 16 | } 17 | 18 | -(NSInteger)settingsIdentifier { 19 | return iterations*4 + strip*2 + alternativeStrategy; 20 | } 21 | 22 | -(BOOL)runWithTempPath:(NSURL *)temp { 23 | NSMutableArray *args = [NSMutableArray arrayWithObjects: @"--lossy_transparent",@"-y",/*@"--",*/file.filePathOptimized.path,temp.path,nil]; 24 | 25 | if (!strip) { 26 | // FIXME: that's crappy. Should list actual chunks in file :/ 27 | [args insertObject:@"--keepchunks=tEXt,zTXt,iTXt,gAMA,sRGB,iCCP,bKGD,pHYs,sBIT,tIME,oFFs,acTL,fcTL,fdAT,prVW,mkBF,mkTS,mkBS,mkBT" atIndex:0]; 28 | } 29 | 30 | int actualIterations = iterations; 31 | unsigned long timelimit = 10 + [file byteSizeOriginal]/1024; 32 | if (timelimit > 60) timelimit = 60; 33 | 34 | if ([file isLarge]) { 35 | actualIterations /= 2; // use faster setting for large files 36 | } 37 | 38 | if ([file isSmall]) { 39 | actualIterations *= 2; 40 | [args insertObject:@"--splitting=3" atIndex:0]; // try both splitting strategies 41 | } else if (alternativeStrategy) { 42 | [args insertObject:@"--splitting=2" atIndex:0]; // by default splitting=1, so make second run use different split 43 | } 44 | 45 | if (actualIterations) { 46 | [args insertObject:[NSString stringWithFormat:@"--iterations=%d", actualIterations] atIndex:0]; 47 | } 48 | 49 | [args insertObject:[NSString stringWithFormat:@"--timelimit=%lu", timelimit] atIndex:0]; 50 | 51 | if (![self taskForKey:@"Zopfli" bundleName:@"zopflipng" arguments:args]) { 52 | return NO; 53 | } 54 | 55 | NSPipe *commandPipe = [NSPipe pipe]; 56 | NSFileHandle *commandHandle = [commandPipe fileHandleForReading]; 57 | 58 | [task setStandardOutput: commandPipe]; 59 | [task setStandardError: commandPipe]; 60 | 61 | [self launchTask]; 62 | 63 | [commandHandle readInBackgroundAndNotify]; 64 | [task waitUntilExit]; 65 | 66 | [commandHandle closeFile]; 67 | 68 | if ([task terminationStatus]) return NO; 69 | 70 | NSInteger fileSizeOptimized = [File fileByteSize:temp]; 71 | if (fileSizeOptimized > 70) { 72 | return [file setFilePathOptimized:temp size:fileSizeOptimized toolName:@"Zopfli"]; 73 | } 74 | return NO; 75 | } 76 | 77 | -(BOOL)isIdempotent { 78 | return NO; 79 | } 80 | 81 | -(BOOL)makesNonOptimizingModifications { 82 | return YES; 83 | } 84 | 85 | @end 86 | -------------------------------------------------------------------------------- /imageoptim/appcast.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim 5 | https://imageoptim.com/appcast.xml 6 | ImageOptim updates 7 | en 8 | 9 | Version 1.5.4 10 | 12 |
  • Added Revert to Original option (restores unoptimized file)
  • 13 |
  • Added cache of already-optimized files. In some cases ImageOptim will be able to quickly skip files it knows it can't optimize any further
  • 14 | 15 | ]]>
    16 | Sat, 12 Jul 2014 00:46:44 +0100 17 | 18 | 10.6.8 19 | 20 | 21 | 22 | 23 | 24 |
    25 |
    26 |
    27 | -------------------------------------------------------------------------------- /imageoptim/cs.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim od Kornela Lesińskiho a přispěvatelů je rozhraním pro programy třetích stran:

    3 |
      4 |
    • 5 | OptiPNG od Cosmina Truty,
    • 6 |
    • 7 | PNGCrush od Glenna Randers-Pehrsona,
    • 8 |
    • 9 | Zopfli od Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG od Andrea Mazzoleniho, Filipeho Estimaa,
    • 12 |
    • 13 | Jpegoptim od Timo Kokkonena,
    • 14 |
    • 15 | Gifsicle od Eddieho Kohlera,
    • 16 |
    • and PNGOUT od Kena Silvermana.
    • 17 |
    18 |

    ImageOptim lze šířit a upravovat za GNU General Public License verze 2 nebo pozdější. Přibalený PNGOUT není GPL kryt a je zahrnut na základě povolení Ardfry Imaging, LLC.

    19 |

    Pavel Fric

    20 |
    21 | -------------------------------------------------------------------------------- /imageoptim/cs.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Nápověda k ImageOptim 4 | 5 | 6 | 7 | 8 | 9 |

    ImageOptim

    10 | 11 |

    Jak používat

    12 | 13 |
      14 |
    1. Jednoduše táhněte a upusťte soubory PNG nebo JPEG nebo adresáře na hlavní okno.
    2. 15 | 16 |
    3. Počkejte, až to bude hotovo.
    4. 17 | 18 |
    5. Radujte se (z menších souborů).
    6. 19 |
    20 |

    Soubory a adresáře lze také přímo přetáhnout na ikonu v panelu.

    21 | 22 |

    Naučte se, jak se dá změnit nastavení programu.

    23 | 24 |

    Ikony v okně činností

    25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
    Zelené XObrázek byl úspěšně vylepšen.
    Green XVšechno je v pořádku. Obrázek se ale už dál nepodařilo vylepšit.
    Šedá hvězdaSoubor s obrázkem je právě vylepšován.
    Šedé tečkySoubor je zařazen a čeká na to, až budou hotovy jiné soubory, aby mohl být vylepšen.
    Oranžový vykřičníkBěhem vylepšování se vyskytla chyba. Vysvětlení naleznete, když spustíte Console.app.
    53 |

    Jak to pracuje

    54 | 55 |

    ImageOptim je rozhraní pro tyto programy:

    56 | 57 |
      58 |
    • OptiPNG
    • 59 | 60 |
    • PNGCrush
    • 61 | 62 |
    • AdvPNG
    • 63 | 64 |
    • JpegOptim
    • 65 | 66 |
    • JpegTran
    • 67 | 68 |
    • a volitelně PNGOUT.
    • 69 |
    70 |

    ImageOptim je spouští. Vybírá z výše jmenovaných programů automaticky ten, který dokáže vytvořit nejmenší velikost souboru.

    71 | 72 | 73 | -------------------------------------------------------------------------------- /imageoptim/cs.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ se nepodařilo spustit"; 3 | 4 | /* undo command name */ 5 | "Add" = "Přidat"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Všechny nezbytné programy byly v Nastavení zakázány"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Soubor se nepodařilo nahrát do paměti"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Vyjmout"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "c se už dál nedá vylepšit"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Soubor není PNG, GIF ani JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Soubor se zkoumá"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Nový soubor"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Vylepšený soubor se nepodařilo uložit"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Vylepšeno úspěšně s %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Uloženo %1$@ z %2$@. %3$@ celkem (až %4$@ na soubor)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Uloženo %1$@ z %2$@. %3$@ obvykle na soubor (až %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Byl spuštěn %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Čeká na vylepšení"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Čeká na to, až bude moci být spuštěno další vylepšování"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/da.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim af Kornel Lesiński og bidragsydere er et GUI for tredjepartsværktøjer:

    3 |
      4 |
    • 5 | OptiPNG af Cosmin Truta,
    • 6 |
    • 7 | PNGCrush af Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli af Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG af Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim af Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle af Eddie Kohler,
    • 16 |
    • and PNGOUT af Ken Silverman.
    • 17 |
    18 |

    ImageOptim kan distribueres og modificeres under GNU General Public License version 2 eller nyere. 19 | Det inkluderede PNGOUT er ikke dækket af GPL, men inkluderet med tilladelse fra Ardfry Imaging, LLC.

    20 |

    Translated by Rasmus Kjær and Rasmus Ljungmann Pedersen.

    21 |
    22 | -------------------------------------------------------------------------------- /imageoptim/da.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ImageOptim Hjælp 9 | 10 | 11 |

    ImageOptim

    12 | 13 |

    Sådan bruges det

    14 | 15 |
      16 |
    1. Træk-og-slip PNG eller JPEG filer/mapper til tabellen i ImageOptim's vindue.
    2. 17 | 18 |
    3. Afvent indtil processen er færdig.
    4. 19 | 20 |
    5. Profit! (fra mindre filer)
    6. 21 |
    22 |

    Du kan også slippe filer på ImageOptim's ikon i din Dock.

    23 | 24 |

    Lær hvordan du ændrer indstillinger.

    25 | 26 |

    Ikoner i filtabel

    27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
    Green CheckmarkBilledet er blevet optimeret med succes.
    Green XAlt gik efter planen, men billedet kunne ikke optimeres yderligere.
    Gray starOptimering af filen er i gang.
    Gray dotsFilen er i kø til at blive optimeret efter de andre filer er færdige.
    Orange exclamation markDer skete en fejl under optimeringen. Du kan finde forklaring ved at køre Console.app.
    55 |

    Hvordan virker det

    56 | 57 |

    ImageOptim er en front-end (GUI) for følgende applikationer:

    58 | 59 |
      60 |
    • OptiPNG
    • 61 | 62 |
    • PNGCrush
    • 63 | 64 |
    • AdvPNG
    • 65 | 66 |
    • JpegOptim
    • 67 | 68 |
    • JpegTran
    • 69 | 70 |
    • og eventuelt PNGOUT.
    • 71 |
    72 |

    ImageOptim kører disse og vælger automatisk den mindste fil.

    73 | 74 | 75 | -------------------------------------------------------------------------------- /imageoptim/da.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ kunne ikke startes"; 3 | 4 | /* undo command name */ 5 | "Add" = "Tilføj"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Alle nødvendige værktøjer er blevet deaktiveret i indstillingerne"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Kan ikke indlæse filen til hukommelsen"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Klip"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Filen kan ikke optimeres yderligere"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Filen er hverken PNG, GIF eller JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Inspicerer fil"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Ny fil"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Den optimerede fil kunne ikke gemmes"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Optimeret med succes med %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Sparede %1$@ ud af %2$@. %3$@ samlet (op til %4$@ per fil)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Sparede %1$@ ud af %2$@. %3$@ per fil i gennemsnit (op til %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Startet med %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Venter på at blive optimeret"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Venter på at starte flere optimeringer"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/de.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim von Kornel Lesiński ist eine GUI für folgende 3rd party utilities:

    3 |
      4 |
    • 5 | OptiPNG von Cosmin Truta,
    • 6 |
    • 7 | PNGCrush von Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG von Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim von Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle von Eddie Kohler,
    • 16 |
    • and PNGOUT von Ken Silverman.
    • 17 |
    18 |

    ImageOptim darf unter den Bedingungen der 19 | GNU General Public License version 2 oder später weitergegeben und modifiziert werden. 20 | Bundled PNGOUT is not 21 | covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    22 |

    Translation by Alexander Mayer.

    23 |
    24 | -------------------------------------------------------------------------------- /imageoptim/de.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | ImageOptim Hilfe 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |

    ImageOptim

    12 | 13 |

    Wie benutzt man ImageOptim?

    14 | 15 |
      16 |
    1. Einfach die PNG/JPEG Dateien oder Ordner per Drag'n'Drop in das Hauptfenster ziehen.
    2. 17 | 18 |
    3. Warten.
    4. 19 | 20 |
    5. Sich freuen! ;)
    6. 21 |
    22 |

    Dateien und Ordner können auch direkt auf das ImageOptim Icon im Dock gezogen werden.

    23 | 24 |

    Informationen zu ImageOptims Einstellungen.

    25 | 26 |

    Icons im Aktivitätsfenster

    27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
    Grüner HakenDas Bild wurde erfolgreich optimiert.
    Grünes XAlles OK. Das Bild konnte lediglich nicht weiter optimiert werden.
    Grauer SternDas Bild wird gerade optimiert.
    Grauer PunktDie Datei befindet sich in der Warteschlange.
    Orangenes AusrufezeichenEs gab einen Fehler während der Optimierung. Weitere Informationen findet man in der Konsole.app.
    55 |

    Wie funktioniert ImageOptim?

    56 | 57 |

    ImageOptim ist eine grafische Oberfläche (GUI) für folgende Programme:

    58 | 59 |
      60 |
    • OptiPNG
    • 61 | 62 |
    • PNGCrush
    • 63 | 64 |
    • AdvPNG
    • 65 | 66 |
    • JpegOptim
    • 67 | 68 |
    • JpegTran
    • 69 | 70 |
    • und optional PNGOUT
    • 71 |
    72 |

    ImageOptim wählt aus den oben genannten Programmen das aus, welches die kleinste Dateigröße produzieren kann.

    73 | 74 | 75 | -------------------------------------------------------------------------------- /imageoptim/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ konnte nicht gestartet werden"; 3 | 4 | /* undo command name */ 5 | "Add" = "Hinzufügen"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Alle benötigten Programme wurden in den Einstellungen deaktiviert"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Die Datei konnte nicht in den Speicher geladen werden"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Ausschneiden"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Die Datei kann nicht mehr weiter optimiert werden"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Der Dateityp ist weder PNG noch JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Analysiere die Datei"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Neue Datei"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Die optimierte Datei konnte nicht gespeichert werden"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Erfolgreich mit %@ optimiert"; 33 | 34 | /* command name, tooltip */ 35 | "Started %@" = "%@ wurde gestartet"; 36 | 37 | /* tooltip */ 38 | "Waiting to be optimized" = "Warte auf Optimierung"; 39 | 40 | /* tooltip */ 41 | "Waiting to start more optimizations" = "Warte darauf weitere Optimierungen starten zu können"; 42 | 43 | -------------------------------------------------------------------------------- /imageoptim/debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "release.xcconfig" 2 | GCC_OPTIMIZATION_LEVEL = 2; 3 | DEAD_CODE_STRIPPING = NO; 4 | GCC_WARN_UNINITIALIZED_AUTOS = NO; 5 | DEPLOYMENT_POSTPROCESSING = NO; 6 | ONLY_ACTIVE_ARCH = YES; 7 | -------------------------------------------------------------------------------- /imageoptim/defaults.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AdvPngEnabled 6 | 7 | AdvPngLevel 8 | 4 9 | JpegOptimEnabled 10 | 11 | JpegOptimMaxQuality 12 | 100 13 | JpegTranStripAll 14 | 15 | JpegTranEnabled 16 | 17 | JpegRescanEnabled 18 | 19 | OptiPngEnabled 20 | 21 | OptiPngLevel 22 | 6 23 | PngCrushEnabled 24 | 25 | PngOutEnabled 26 | 27 | PngOutLevel 28 | 3 29 | PngOutRemoveChunks 30 | 31 | PngOutInterruptIfTakesTooLong 32 | 33 | ZopfliEnabled 34 | 35 | ZopfliIterations 36 | 15 37 | GifsicleEnabled 38 | 39 | PreservePermissions 40 | 41 | RunConcurrentDirscans 42 | 2 43 | RunConcurrentTasks 44 | 4 45 | RunLowPriority 46 | 47 | PngQuantEnabled 48 | 49 | BounceDock 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /imageoptim/dsa_pub.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIDOzCCAi0GByqGSM44BAEwggIgAoIBAQD/29U8O2QEO+QqYO0VeIuZI1gdtqS5 3 | YNVmRKZDxg6FEsQ+KvRspaH+6GD7m8wuDGVWcZBhinoOz/T046T7h75yYfgYm8i+ 4 | YI4FUK7XhwQM4gNBQ1TiyrwlvZVPkwjIlkI8uOqEAIYweNfIqWcZFM/V+KgYvqo/ 5 | cewiwY0ehKgOXY7qlQY22DlKQNzo/ccmx0aKtTpRljUu+j+6oVbX0hwH7LkPRP/l 6 | El3ifD8p0WcXC9kixFN1ns4jaOM74tzBhJay36Yg3T3dxym/IyiDC8vdiKfK4baW 7 | VYGYLbOqOIeDwTCMM59rbMY2NofXtU0hc6yf0U4lSA9dFS9toyxGSqaLAhUAoBfn 8 | GkaNya1RFlqA+FINPZ4B7LUCggEAdK/HQA/HPGLoMx+XeqlRSFymc+qMySfYnoc2 9 | PzryRWCalhXINjXmHjkcLoylsTXtRzn6ktPymf+8FhkMkDZs+DtSaYusHrPBwk2w 10 | SjHklZgIUnvnEPN4t/US29d10dHqqQYdjwROuWWJNM7E4To79XjR1AeG84yXvpMm 11 | Nrtp9XeCQLWmOvctSp5ZEhqnEjRCxBzowYM5NDLWA8h46689sM/1C3lsCOb+XQHa 12 | R9TklxRtlbpNW90cPzbPxji+xRjHUc9R8fHW4Wx6s/JRu3gHREkAGyyJ1k93T8vc 13 | p10U4qGGJTlHiBUt3fWZGnZzmz4j4Yw1MOwdoSBgrF3/wsZ6IQOCAQYAAoIBAQDt 14 | Jk3nm5uTf44d8lMLiKQVrE7QttfHFMHGPXkBzomBar3rvSV46dmOdSqKRkE+JXNU 15 | x81iA/otMDr//uBnviwPOwJCMXnli2CTZXuBITTfDqIu7/2CzlPL3sSqhpp8tpAF 16 | 7vnVOvk4TTk23P93qjil/mlqiRzyefn9NgbEKkWMrzDOnpTCajH02ZTZZxVqFtyX 17 | PLArdOfV+QMJtSIlVCsy0EwudDdK7gL2ef7+QWzzoVo2FVQFOpckvnmsC65yL/9v 18 | 4sPVDR/mNPOC0dML9fkRJr6ykD4IgOw+lwSDxBE8vgQmvy8n3U4zVPyfdgSndAKF 19 | AEjuJ8qRswZ0xG0B8D2W 20 | -----END PUBLIC KEY----- 21 | -------------------------------------------------------------------------------- /imageoptim/el.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim by Kornel Lesiński and contributors is a GUI for 3rd party utilities:

    3 |
      4 |
    • 5 | OptiPNG by Cosmin Truta,
    • 6 |
    • 7 | PNGCrush by Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG by Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim by Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle by Eddie Kohler,
    • 16 |
    • and PNGOUT by Ken Silverman.
    • 17 |
    18 |

    ImageOptim can be redistributed and modified under GNU General Public License version 2 or later. 19 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    20 |
    21 | -------------------------------------------------------------------------------- /imageoptim/el.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Βοήθεια ImageOptim 4 | 5 | 6 | 7 | 8 | 9 |

    ImageOptim

    10 | 11 |

    Πώς χρησιμοποιείται

    12 | 13 |
      14 |
    1. Σύρετε και αφήστε αρχεία PNG, JPEG ή φακέλους μέσα στο κεντρικό παράθυρο του ImageOptim
    2. 15 | 16 |
    3. Περιμένετε μέχρι να τελειώσει.
    4. 17 | 18 |
    5. Κέρδος! (από μικρότερα αρχεία)
    6. 19 |
    20 |

    Μπορείτε επίσεις να ρίξετε αρχεία στο εικονίδιο του ImageOptim στο Dock

    21 | 22 |

    Μάθετε πως να αλλάζετε τις Προτιμήσεις.

    23 | 24 |

    Επεξήγηση εικονιδίων

    25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
    Green CheckmarkΗ εικόνα έχει βελτιστοποιηθεί με επιτυχία.
    Green XΌλα πήγαν μια χαρά, αλλά η εικόνα δεν θα μπορούσε να βελτιστοποιηθεί περαιτέρω.
    Gray starΗ βελτιστοποίηση αυτού του αρχείου βρίσκεται σε εξέλιξη.
    Gray dotsΤο αρχείο είναι στην ουρά για βελτιστοποίηση, μετά το τέλος των άλλων.
    Orange exclamation markΠαρουσιάστηκε σφάλμα κατά τη διάρκεια της βελτιστοποίησης. Θα βρείτε εξήγηση εκτελώντας το Console.app.
    53 |

    Πώς λειτουργεί

    54 | 55 |

    Το ImageOptim είναι ένα front-end (GUI) για αυτές τις εφαρμογές:

    56 | 57 |
      58 |
    • OptiPNG
    • 59 | 60 |
    • PNGCrush
    • 61 | 62 |
    • AdvPNG
    • 63 | 64 |
    • JpegOptim
    • 65 | 66 |
    • JpegTran
    • 67 | 68 |
    • και προαιρετικά PNGOUT.
    • 69 |
    70 |

    Το ImageOptim τα τρέχει, και επιλέγει αυτόματα το μικρότερο αρχείο.

    71 | 72 | 73 | -------------------------------------------------------------------------------- /imageoptim/el.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ απετυχε η έναρξη"; 3 | 4 | /* undo command name */ 5 | "Add" = "Προσθηκη"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Oλα τα απαιτούμενα εργαλεία έχουν απενεργοποιηθει στις Ρυθμισεις "; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Δεν είναι δυνατή η χαρτογράφηση αρχείου στη μνήμη"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Αποκοπη"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Το αρχείο δεν μπορεί να βελτιστοποιηθεί περαιτέρω"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Το αρχείο δεν είναι ούτε PNG, GIF, ούτε JPEG "; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Επιθεώρηση αρχείου"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Νεο αρχειο"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Το βελτιωμενο αρχειο δεν μπορεσε να αποθηκευθει"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Βελτιωση επιτυχης με %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Κερδήθηκαν %1$@ από %2$@. %3$@ συνολικά (έως %4$@ ανά αρχείο)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Κερδήθηκαν %1$@ από %2$@. %3$@ ανά αρχείο στο μέσο όρο (μέχρι %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Εναρξη %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Περιμένοντας για βελτιωση"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Αναμονή για να ξεκινήσουν οι βελτιωσεις"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/en-GB.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim Help 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

    ImageOptim

    13 | 14 |

    How to use

    15 | 16 |
      17 |
    1. Drag'n'drop PNG or JPEG files or directories onto main table view in ImageOptim's window.
    2. 18 | 19 |
    3. Wait until it finishes.
    4. 20 | 21 |
    5. Profit! (from smaller files)
    6. 22 |
    23 |

    You can also drop files onto ImageOptim's Dock icon.

    24 | 25 |

    Learn how to change Preferences.

    26 | 27 |

    Icons in file table

    28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
    Green CheckmarkImage has been optimised successfully.
    Green XEverything went fine, but image couldn't be optimised any further.
    Gray starOptimisation of this file is in progress.
    Gray dotsFile is queued to be optimised after other files are finished.
    Orange exclamation markThere was an error during optimisation. You'll find explanation by running Console.app.
    56 |

    How does it work

    57 | 58 |

    ImageOptim is a front-end (GUI) for these applications:

    59 | 60 |
      61 |
    • OptiPNG
    • 62 | 63 |
    • PNGCrush
    • 64 | 65 |
    • AdvPNG
    • 66 | 67 |
    • JpegOptim
    • 68 | 69 |
    • JpegTran
    • 70 | 71 |
    • and optionally PNGOUT.
    • 72 |
    73 |

    ImageOptim runs them and automatically selects smallest file.

    74 | 75 | 76 | -------------------------------------------------------------------------------- /imageoptim/en-GB.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "File cannot be optimized any further" = "File cannot be optimised any further"; 2 | "Optimized file could not be saved" = "Optimised file could not be saved"; 3 | "Optimized successfully with %@" = "Optimised successfully with %@"; 4 | "Waiting to be optimized" = "Waiting to be optimised"; 5 | "Waiting to start more optimizations" = "Waiting to start more optimisations"; 6 | -------------------------------------------------------------------------------- /imageoptim/en.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |

    ImageOptim by Kornel Lesiński and contributors is a GUI for 3rd party utilities:

    2 |
      3 |
    • 4 | OptiPNG by Cosmin Truta,
    • 5 |
    • 6 | PNGCrush by Glenn Randers-Pehrson,
    • 7 |
    • 8 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 9 |
    • 10 | AdvPNG by Andrea Mazzoleni, Filipe Estima,
    • 11 |
    • 12 | Jpegoptim by Timo Kokkonen,
    • 13 |
    • 14 | Gifsicle by Eddie Kohler,
    • 15 |
    • 16 | and PNGOUT by Ken Silverman.
    • 17 |
    18 |
    19 |

    20 | ImageOptim can be redistributed and modified under GNU General Public License version 2 or later. 21 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC. 22 |

    23 | -------------------------------------------------------------------------------- /imageoptim/en.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim Help 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

    13 | ImageOptim 14 |

    15 |

    16 | How to use 17 |

    18 |
      19 |
    1. Drag'n'drop PNG or JPEG files or directories onto main table view in ImageOptim's window. 20 |
    2. 21 |
    3. Wait until it finishes. 22 |
    4. 23 |
    5. Profit! (from smaller files) 24 |
    6. 25 |
    26 |

    27 | Files will be overwritten with smaller versions. Unoptimized versions will be moved to Trash. 28 |

    29 |

    30 | You can also drop files onto ImageOptim's Dock icon. 31 |

    32 |

    33 | Learn how to change Preferences. 34 |

    35 |

    36 | Icons in file table 37 |

    38 | 39 | 40 | 43 | 46 | 47 | 48 | 51 | 54 | 55 | 56 | 59 | 62 | 63 | 64 | 67 | 70 | 71 | 72 | 75 | 78 | 79 |
    41 | Green Checkmark 42 | 44 | Image has been optimized successfully. 45 |
    49 | Green X 50 | 52 | Everything went fine, but image couldn't be optimized any further. 53 |
    57 | Gray star 58 | 60 | Optimization of this file is in progress. 61 |
    65 | Gray dots 66 | 68 | File is queued to be optimized after other files are finished. 69 |
    73 | Orange exclamation mark 74 | 76 | There was an error during optimization. You'll find explanation by running Console.app. 77 |
    80 |

    81 | How does it work 82 |

    83 |

    84 | ImageOptim is a front-end (GUI) for these applications: 85 |

    86 |
      87 |
    • Zopfli
    • 88 |
    • OptiPNG
    • 89 |
    • PNGCrush
    • 90 |
    • AdvPNG
    • 91 |
    • JpegOptim
    • 92 |
    • JpegTran
    • 93 |
    • JpegRescan
    • 94 |
    • and PNGOUT.
    • 95 |
    96 |

    97 | ImageOptim runs them and automatically selects the smallest file. 98 |

    99 | 100 | 101 | -------------------------------------------------------------------------------- /imageoptim/en.lproj/PrefsController.strings: -------------------------------------------------------------------------------- 1 | 2 | /* "Window"; title = "ImageOptim Preferences"; ObjectID = "5"; */ 3 | "5.title" = "ImageOptim Preferences"; 4 | 5 | /* "TabViewItem"; label = "General"; ObjectID = "167"; */ 6 | "167.label" = "General"; 7 | 8 | /* "Box"; title = "Writing files to disk"; ObjectID = "280"; */ 9 | "280.title" = "Writing files to disk"; 10 | 11 | /* button "Preserve file permissions, attributes and hardlinks"; ObjectID = "804"; */ 12 | "804.title" = "Preserve file permissions, attributes and hardlinks"; 13 | 14 | /* "Optimization level"; ObjectID = "818"; */ 15 | "818.title" = "Optimization level"; 16 | 17 | /* "Fast"; ObjectID = "819"; */ 18 | "819.title" = "Fast"; 19 | 20 | /* "Insane"; ObjectID = "820"; */ 21 | "820.title" = "Insane"; 22 | 23 | /* "Normal"; ObjectID = "821"; */ 24 | "821.title" = "Normal"; 25 | 26 | /* "Extra"; ObjectID = "822"; */ 27 | "822.title" = "Extra"; 28 | 29 | /* button "Make images interlaced (progressive)"; ObjectID = "828"; */ 30 | "828.title" = "Make images interlaced (progressive)"; 31 | 32 | /* "Optimization level"; ObjectID = "829"; */ 33 | "829.title" = "Optimization level"; 34 | 35 | /* "Interlaced files are usually larger"; ObjectID = "831"; */ 36 | "831.title" = "Interlaced files are usually larger"; 37 | 38 | /* "24 trials"; ObjectID = "833"; */ 39 | "833.title" = "24 trials"; 40 | 41 | /* "240 trials"; ObjectID = "834"; */ 42 | "834.title" = "240 trials"; 43 | 44 | /* Checkbox in Preferences. Text shouldn't be longer than English version. */ 45 | "854.title" = "Strip PNG metadata (gamma, color profiles, optional chunks)"; 46 | 47 | /* "Optimization type"; ObjectID = "856"; */ 48 | "856.title" = "Optimization type"; 49 | 50 | /* "Simple"; ObjectID = "857"; */ 51 | "857.title" = "Simple"; 52 | 53 | /* "Xtreme"; ObjectID = "858"; */ 54 | "858.title" = "Xtreme"; 55 | 56 | /* "Intense"; ObjectID = "860"; */ 57 | "860.title" = "Intense"; 58 | 59 | /* "Longest match"; ObjectID = "861"; */ 60 | "861.title" = "Longest match"; 61 | 62 | /* "Web browsers require gamma chunks to be removed"; ObjectID = "865"; */ 63 | "865.title" = "Web browsers require gamma chunks to be removed"; 64 | 65 | /* "Maximum quality"; ObjectID = "868"; */ 66 | "868.title" = "Maximum quality"; 67 | 68 | /* Checkbox in Preferences. Text shouldn't be longer than English version. */ 69 | "911.title" = "Strip JPEG metadata (EXIF, color profiles, GPS, rotation, etc.)"; 70 | 71 | /* button "Interrupt if takes too long to execute"; ObjectID = "946"; */ 72 | "946.title" = "Interrupt if takes too long to execute"; 73 | 74 | /* "Box"; title = "Metadata and color profiles"; ObjectID = "1043"; */ 75 | "1043.title" = "Metadata and color profiles"; 76 | 77 | /* Header above list of tools to enable */ 78 | "1107.title" = "Enable"; 79 | 80 | /* "Saving to network drives is faster when permissions are not preserved"; ObjectID = "1122"; */ 81 | "1122.title" = "Saving to network drives is faster when permissions are not preserved"; 82 | 83 | /* "Not recommended if you rely on embedded copyright information"; ObjectID = "1124"; */ 84 | "1124.title" = "Not recommended if you rely on embedded copyright information"; 85 | -------------------------------------------------------------------------------- /imageoptim/err.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/err.png -------------------------------------------------------------------------------- /imageoptim/err@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/err@2x.png -------------------------------------------------------------------------------- /imageoptim/es.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim de Kornel Lesiński es un GUI para las siguientes herramientas de terceros:

    3 |
      4 |
    • 5 | OptiPNG de Cosmin Truta,
    • 6 |
    • 7 | PNGCrush de Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli de Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG de Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim de Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle de Eddie Kohler,
    • 16 |
    • y PNGOUT de Ken Silverman.
    • 17 |
    18 |

    ImageOptim puede ser redistribuido y modificado bajo 19 | GNU General Public License versión 2 o posterior. 20 | El PNGOUT empaquetado no está cubierto por la GPL y ha sido incluido con permiso de Ardfry Imaging, LLC.

    21 |

    Traducido por Benjamin Pollard Nelson, Wayne Hartman y Sendoa Portuondo.

    22 |
    23 | -------------------------------------------------------------------------------- /imageoptim/es.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Ayuda de ImageOptim 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

    ImageOptim

    15 | 16 |

    Modo de uso

    17 | 18 |
      19 |
    1. Arrastre y suelte archivos JPEG o PNG o carpetas en la tabla de la ventana principal de ImageOptim.
    2. 20 | 21 |
    3. Espere hasta que termine.
    4. 22 | 23 |
    5. ¡Aprovechese de los archivos más pequeños!
    6. 24 |
    25 |

    También puede soltar archivos encima del icono de ImageOptim en el Dock.

    26 | 27 |

    Aprenda a cambiar las Preferencias.

    28 | 29 |

    Los iconos de la tabla de archivos

    30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
    Visto verdeLa imagen ha sido optimizada con éxito.
    X VerdeTodo salió bien, pero la imagen ya no pudo ser mejor optimizada.
    Estrella grisLa optimización del archivo está en curso.
    Puntos grisesEl archivo ha sido añadido a la cola para ser optimizado después de que otros archivos estén acabados.
    Signo de exclamación naranjaHubo un error durante la optimización. Encontrará una explicación mediante la ejecución de Console.app.
    58 |

    Cómo funciona

    59 | 60 |

    ImageOptim es un front-end (GUI) para estas aplicaciones:

    61 | 62 |
      63 |
    • OptiPNG
    • 64 | 65 |
    • PNGCrush
    • 66 | 67 |
    • AdvPNG
    • 68 | 69 |
    • JpegOptim
    • 70 | 71 |
    • JpegTran
    • 72 | 73 |
    • y opcionalmente PNGOUT.
    • 74 |
    75 |

    ImageOptim ejecuta dichas aplicaciones y selecciona automáticamente el archivo más pequeño.

    76 | 77 | 78 | -------------------------------------------------------------------------------- /imageoptim/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ no se pudo iniciar"; 3 | 4 | /* undo command name */ 5 | "Add" = "Añadir"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Todas las herramientas necesarias han sido desactivadas en las Preferencias"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "No se puede mapear el archivo en la memoria"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Cortar"; 15 | 16 | "KB" = "KO"; 17 | 18 | /* tooltip */ 19 | "File cannot be optimized any further" = "El archivo no se puede optimizar más"; 20 | 21 | /* tooltip */ 22 | "File is neither PNG, GIF nor JPEG" = "El archivo no es ni PNG ni JPG"; 23 | 24 | /* tooltip */ 25 | "Inspecting file" = "Inspeccionando archivo"; 26 | 27 | /* newly added to the queue */ 28 | "New file" = "Nuevo archivo"; 29 | 30 | /* tooltip */ 31 | "Optimized file could not be saved" = "El archivo optimizado no se pudo guardar"; 32 | 33 | /* tooltip */ 34 | "Optimized successfully with %@" = "Optimizado con éxito usando %@"; 35 | 36 | /* total ratio, status bar */ 37 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Ahorrados %1$@ de %2$@. Total %3$@ (hasta %4$@ por archivo)"; 38 | 39 | /* per file avg, status bar */ 40 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Ahorrados %1$@ de %2$@. %3$@ por archivo en promedio (hasta %4$@)"; 41 | 42 | /* command name, tooltip */ 43 | "Started %@" = "Iniciado %@"; 44 | 45 | /* tooltip */ 46 | "Waiting to be optimized" = "Esperando para ser optimizado"; 47 | 48 | /* tooltip */ 49 | "Waiting to start more optimizations" = "A la espera de iniciar más optimizaciones"; 50 | 51 | -------------------------------------------------------------------------------- /imageoptim/fr.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim de Kornel Lesiński est une interface graphique pour les programmes suivants:

    3 |
      4 |
    • 5 | OptiPNG de Cosmin Truta,
    • 6 |
    • 7 | PNGCrush de Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG de Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim de Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle de Eddie Kohler,
    • 16 |
    • et PNGOUT de Ken Silverman.
    • 17 |
    18 |

    ImageOptim peut être redistribué et modifié en respectant 19 | la Licence Publique Générale GNU version 2 ou suivante. 20 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    21 |

    Traduction française de Mathias Richter.

    22 |
    23 | -------------------------------------------------------------------------------- /imageoptim/fr.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Aide ImageOptim 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

    ImageOptim

    15 | 16 |

    Glissez/déposez des fichiers JPG, PNG ou dossiers dans le tableau central d'ImageOptim.

    17 | 18 |
      19 |
    1. Attendez la fin des traitements.
    2. 20 | 21 |
    3. Tirez avantage de vos nouveaux fichiers plus petits.
    4. 22 | 23 |
    5. Vous pouvez également déposer vos fichiers sur l'icône d'ImageOptim.
    6. 24 |
    25 |

    Découvrez les différents réglages des préférences.

    26 | 27 |

    Pictogrammes du tableau

    28 | 29 |

    Coche verte

    30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
    Traitements réussis, le fichier est plus petit.Croix verte
    Traitements réussis, le fichier n'est pas plus petit (déjà optimal).Roue grise
    Optimisations en cours.Points gris
    En file d'attente, l'optimisation démarrera prochainement.Point d'exclamation orange
    Traitements en erreur. Vous pouvez consultez la log avec Console.app pour plus de détails.Comment ça fonctionne ?
    58 |

    ImageOptim est une interface graphique pour les programmes suivants :

    59 | 60 |

    OptiPNG

    61 | 62 |
      63 |
    • PNGCrush
    • 64 | 65 |
    • AdvPNG
    • 66 | 67 |
    • JpegOptim
    • 68 | 69 |
    • JpegTran
    • 70 | 71 |
    • et PNGOUT (optionnel, à rajouter manuellement)
    • 72 | 73 |
    • ImageOptim lance ces programmes et ne conserve que le plus petit fichier généré.
    • 74 |
    75 |

    ImageOptim les exécute et sélectionne automatiquement le plus petit fichier.

    76 | 77 | 78 | -------------------------------------------------------------------------------- /imageoptim/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ erreur au lancement"; 3 | 4 | /* undo command name */ 5 | "Add" = "Ajouter des fichiers…"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Tous les programmes sont désactivés dans les Préférences"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Impossible de charger le fichier en mémoire"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Couper"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Le fichier ne peut être optimisé davantage"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Le fichier n'est ni un PNG ni un JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Analyse du fichier"; 24 | 25 | /* kilobytes suffix */ 26 | "KB" = "Ko"; 27 | 28 | /* megabytes suffix */ 29 | "MB" = "Mo"; 30 | 31 | /* newly added to the queue */ 32 | "New file" = "Nouveau fichier"; 33 | 34 | /* tooltip */ 35 | "Optimized file could not be saved" = "Le fichier optmimisé n'a pas pu être sauvegardé"; 36 | 37 | /* tooltip */ 38 | "Optimized successfully with %@" = "Optimisé avec succès (%@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "%@ démarré"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "En attente d'optimisation"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "En attente d'autres optimisations"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/getsparkle.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | SPARKLE=$1 3 | 4 | TARGET_TEMP_DIR=${TARGET_TEMP_DIR:-/tmp/} 5 | SPARKLETMP=$TARGET_TEMP_DIR/Sparkle.framework 6 | SPARKLEFALLBACK=${SRCROOT:-/tmp/none/}/Sparkle.framework 7 | SPARKLEZIP=$TARGET_TEMP_DIR/sparkle.tar.bz2 8 | 9 | if test -e "$SPARKLE"; then 10 | exit 0; 11 | fi 12 | 13 | if test ! -d "$(dirname "$SPARKLE")"; then 14 | mkdir -p "$(dirname "$SPARKLE")" || exit 1 15 | fi 16 | 17 | if test -e "$SPARKLETMP"; then 18 | cp -R "$SPARKLETMP" "$SPARKLE" && exit 0 19 | fi 20 | 21 | if test -e "$SPARKLEFALLBACK"; then 22 | cp -R "$SPARKLEFALLBACK" "$SPARKLE" && exit 0 23 | fi 24 | 25 | echo Downloading Sparkle 26 | 27 | test ! -e "$SPARKLEZIP" || rm -rf "$SPARKLEZIP" 28 | curl -L https://github.com/sparkle-project/Sparkle/releases/download/1.9.0/Sparkle-1.9.0.tar.bz2 -o "$SPARKLEZIP" || exit 1 29 | tar xjvf "$SPARKLEZIP" --strip-components 1 --include '*/Sparkle.framework' -C "$TARGET_TEMP_DIR/" || exit 1 30 | 31 | cp -R "$SPARKLETMP" "$SPARKLE" 32 | -------------------------------------------------------------------------------- /imageoptim/it.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim di Kornel Lesiński una GUI per l'utilizzazione di terze parti:

    3 |
      4 |
    • 5 | OptiPNG di Cosmin Truta,
    • 6 |
    • 7 | PNGCrush di Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG di Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim di Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle di Eddie Kohler,
    • 16 |
    • e PNGOUT di Ken Silverman.
    • 17 |
    18 |

    ImageOptim può essere ridistribuito e modificato sotto 19 | Licenza generale pubblica GNU versione 2 o successive. 20 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    21 |
    22 | -------------------------------------------------------------------------------- /imageoptim/it.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Aiuto di ImageOptim 4 | 5 | 6 | 7 | 8 | 9 |

    ImageOptim

    10 | 11 |

    Guida all'uso

    12 | 13 |
      14 |
    1. Trascina file PNG o JPEG o cartelle dentro il riquadro principale nella finestra di ImageOptim.
    2. 15 | 16 |
    3. Attendi fino a quando non finisce.
    4. 17 | 18 |
    5. Guadagno! (dai files più piccoli)
    6. 19 |
    20 |

    Puoi anche droppare i file dentro l'icona nel Dock di ImageOptim.

    21 | 22 |

    Scopri come cambiare le Preferenze.

    23 | 24 |

    Icone nella tabella dei file

    25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
    Segno di spunta verdeL'immagine è stata ottimizzata con successo.
    Green XTutto è andato bene, ma l'immagine non può essere ottimizzata ancora.
    Stella grigiaL'ottimizzazione di questo file è in corso.
    Punti grigiIl file è in coda per essere ottimizzato subito dopo che altri file sono stati ultimati.
    Punto esclamativo arancioneSi è verificato un errore durante l'ottimizzazione. Troverai maggiori informazioni lanciando Console.app.
    53 |

    Come funziona

    54 | 55 |

    ImageOptim è un front-end (GUI) per le seguenti applicazioni:

    56 | 57 |
      58 |
    • OptiPNG
    • 59 | 60 |
    • PNGCrush
    • 61 | 62 |
    • AdvPNG
    • 63 | 64 |
    • JpegOptim
    • 65 | 66 |
    • JpegTran
    • 67 | 68 |
    • e facoltativamente PNGOUT.
    • 69 |
    70 |

    ImageOptim li processa e automaticamente seleziona il file più piccolo.

    71 | 72 | 73 | -------------------------------------------------------------------------------- /imageoptim/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ ha fallito l'avvio"; 3 | 4 | /* undo command name */ 5 | "Add" = "Aggiungi"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Tutte le utilità sono state disabilitate nelle Preferenze"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Non posso mappare il file in memoria"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Taglia"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Il file non può essere ottimizzato ulteriormente"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Il file non è PNG né JPG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Controllo il file"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Nuovo file"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Il file ottimizzato potrebbe non essere salvato"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Ottimizzazione avvenuta al (%@)"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Risparmiato %1$@ su %2$@. %3$@ complessivamente (fino a %4$@ per file)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Risparmiato %1$@ su %2$@. %3$@ per file in media (fino a %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "%@ iniziato"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "In attesa di ottimizzazione"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Attendi prima di effettuare ulteriori ottimizzazioni"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/ja.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim by Kornel Lesiński and contributors is a GUI for 3rd party utilities:

    3 |
      4 |
    • 5 | OptiPNG by Cosmin Truta,
    • 6 |
    • 7 | PNGCrush by Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG by Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim by Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle by Eddie Kohler,
    • 16 |
    • and PNGOUT by Ken Silverman.
    • 17 |
    18 |

    ImageOptim can be redistributed and modified under GNU General Public License version 2 or later. 19 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    20 |
    21 | -------------------------------------------------------------------------------- /imageoptim/ja.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ImageOptim ヘルプ 9 | 10 |

    ImageOptim

    11 | 12 |

    使い方

    13 | 14 |
      15 |
    1. PNG ファイル、JPEG ファイル、またはフォルダを、ImageOptim ウインドウにドラッグアンドドロップしてください。
    2. 16 | 17 |
    3. 完了するまでお待ちください。
    4. 18 | 19 |
    5. 得しましたね! (ファイルの容量が小さくなりました)
    6. 20 |
    21 |

    同様に ImageOptim の Dock アイコンにもドラッグアンドドロップできます。

    22 | 23 |

    設定の変更方法について

    24 | 25 |

    ファイル一覧のアイコンについて

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Green Checkmark画像の最適化に成功しました。
    Green X処理はうまくいきましたが、画像をこれ以上最適化できませんでした。
    Gray starこのファイルの最適化を実行中です。
    Gray dotsこのファイルは、他のファイルの最適化が終わるのを待っています。
    Orange exclamation mark最適化中にエラーが発生しました。 コンソール.app から原因を確認できます。
    54 |

    仕組み

    55 | 56 |

    ImageOptim は下記のアプリケーションのフロントエンド (GUI) です:

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • PNGOUT(オプション)
    • 70 |
    71 |

    ImageOptim は上記のアプリケーションを実行して、もっとも容量の小さなファイルを自動で選択します。

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/ja.lproj/Help/prefs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim 環境設定 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim 環境設定

    11 |

    « TOPに戻る

    12 |

    一般設定

    13 |
    14 |
    ファイルのパーミッション、属性、ハードリンクを維持する
    15 |
    16 |

    古いファイルを削除して新しいファイルを作り直す代わりに、古いファイルの内容を更新するだけの処理をします。このことにより、全てのハードリンク、エイリアス、ファイルの所有権、パーミッション、ファイルの拡張情報などは同じまま保たれます。

    17 |

    これはパーミッションを維持しないよりも少々高速です。

    18 |
    19 |
    すべての拡張情報を削除
    20 |
    21 |

    ウェブサイト向けの最適化をする場合有効にしてください。もしPNGに必要なメタデータを入れている場合無効にしてください。

    22 |

    Other invisible information is removed as well, such as DPI and comments.

    23 |
    24 |
    EXIF出力情報とコメントをファイルから取り除く
    25 |
    26 |

    画像のメタデータ(カラー設定、露出時間、GPS情報、カメラのモデル情報、JPEG出力につかれたソフトウェア名など)を削除します。1.3MB以上の画像からはメタデータを削除しません。

    27 |

    Embedded copyright information is removed as well. Please note that generally images are protected by copyright law regardless whether they contain such invisible metadata or not.

    28 |
    29 |
    30 |

    ツール

    31 |

    Zopfli and PNGOUT are very good PNG compressors, but are very slow. Disable them if you need to optimize PNG files quickly (leave only AdvPNG for fastest, but still good compression).

    32 |

    Zopfli and OptiPNG will clean RGB values of transparent pixels (known as “dirty alpha”). Disable these two tools if you're optimizing special files that use alpha channel for something else than transparency (e.g. heightmap in game data files).

    33 |
    34 |

    JPEGOptim

    35 |
    36 |
    最高品質
    37 |
    38 |

    100%に設定された場合、最適化は無圧縮です。

    39 |

    100%以下に設定した場合、それ以上の品質で保管された画像の品質低下につながります。

    40 |
    41 |
    42 |
    43 |
    44 |

    PNGOUT

    45 |
    46 |
    最適化タイプ
    47 |
    48 |

    PNGOUTはとても効率的ですが、一方非常に低速です。低速な処理に耐えられない場合、低い最適化レベルを選ぶようにしてください。

    49 |
    50 |
    実行時間が長すぎる場合中断する
    51 |
    52 |

    PNGOUTは非常に多くの時間を大きなファイルの最適化のために使う場合があります。このオプションをチェックすると、PNGOUTが1分以上処理を続けた場合処理を中断します。

    53 |
    54 |
    55 |
    56 |
    57 |

    OptiPNG

    58 |
    59 |
    最適化レベル
    60 |
    61 |

    テストされる違う設定の組み合わせの番号を選択します。全てを実施することが意味を成すことはあまりありません。

    62 |
    63 |
    画像をインターレース(プログレッシブ)化する
    64 |
    65 |

    インターレース化された画像は読み込み途中の状態で良く見えます。しかし、一般的にインターレース化により圧縮の最適化は非効率になってしまいます。

    66 |

    このチェックボックスは3つの状態を持ちます: チェックされた場合インターレース化を共用します。組み合わせる場合、インターレース設定を維持します。チェックが入っていない場合、インターレースを全て解除します。

    67 |
    68 |
    69 |
    70 |
    71 |

    Gifsicle

    72 |

    最も最適に圧縮するためにGIFファイルをPNGに変換すべきです。(ImageOptimは自動的にこれらを実施しません。)

    73 |
    74 | 75 | 76 | -------------------------------------------------------------------------------- /imageoptim/ja.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | CFBundleDisplayName = イメージオプティム 2 | -------------------------------------------------------------------------------- /imageoptim/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ での最適化の開始に失敗しました"; 3 | 4 | /* undo command name */ 5 | "Add" = "追加"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "必須ツールすべてが環境設定で無効になっています"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "ファイルをメモリに展開できません"; 12 | 13 | /* undo command name */ 14 | "Cut" = "カット"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "これ以上ファイルを最適化できません"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "ファイルが PNG、GIF、JPEG のいずれの形式でもありません"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "ファイルの検証中"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "新しいファイル"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "最適化されたファイルを保存できませんでした"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "%@ で最適化に成功しました"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "%2$@ のうち %1$@ を節減。全体で %3$@ (1ファイル最大で %4$@)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "%2$@のうち %1$@ を節減。1ファイル平均で %3$@ (最大で %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "%@ で最適化を開始しました"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "最適化を待っています"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "追加の最適化の開始を待っています"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/ko.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim by Kornel Lesiński and contributors is a GUI for 3rd party utilities:

    3 |
      4 |
    • 5 | OptiPNG by Cosmin Truta,
    • 6 |
    • 7 | PNGCrush by Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG by Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim by Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle by Eddie Kohler,
    • 16 |
    • and PNGOUT by Ken Silverman.
    • 17 |
    18 |

    ImageOptim can be redistributed and modified under GNU General Public License version 2 or later. 19 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    20 |
    21 | -------------------------------------------------------------------------------- /imageoptim/ko.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim Help 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

    ImageOptim

    13 | 14 |

    어떻게 사용하나요

    15 | 16 |
      17 |
    1. ImageOptim 화면 안에 PNG / JPEG 파일 또는 폴더를 끌어다 놓으세요.
    2. 18 | 19 |
    3. 완료 될 때까지 기다리세요.
    4. 20 | 21 |
    5. 완료!
    6. 22 |
    23 |

    ImageOptime의 Dock 아이콘에 파일들을 끌어다 놓을 수 있습니다.

    24 | 25 |

    환경설정 변경하는 방법을 배워봅시다..

    26 | 27 |

    파일 리스트의 아이콘 설명

    28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
    Green Checkmark이미지가 성공적으로 최적화 되었습니다.
    Green X이미 최적화 되어 있어, 더 이상 이미지를 최적화 할 수 없습니다.
    Gray star파일의 최적화가 진행 중입니다.
    Gray dots다른 파일 최적화 작업이 완료되기를 기다리는 중입니다.
    Orange exclamation mark최적화 작업 중에 에러가 발생했습니다. Console.app를 실행시켜 이유를 찾아보세요.
    56 |

    어떻게 동작 하나요.

    57 | 58 |

    ImageOptim은 아래 응용 프로그램들을 위한 애플리케이션(GUI)입니다.

    59 | 60 |
      61 |
    • OptiPNG
    • 62 | 63 |
    • PNGCrush
    • 64 | 65 |
    • AdvPNG
    • 66 | 67 |
    • JpegOptim
    • 68 | 69 |
    • JpegTran
    • 70 | 71 |
    • 그리고 optionally PNGOUT.
    • 72 |
    73 |

    ImageOptim은 위의 작업을 수행하고 자동적으로 가장 작은 파일로 만들어줍니다.

    74 | 75 | 76 | -------------------------------------------------------------------------------- /imageoptim/ko.lproj/Help/prefs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim 환경설정 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim 환경설정

    11 |

    « 소개페이지로 이동

    12 |

    일반 환경설정

    13 |
    14 |
    파일 권한, 속성 그리고 하드링크 유지하기
    15 |
    16 |

    같은 이름으로 된 파일을 삭제 후 생성하는 것이 아니라, 파일의 내용을 덮어씁니다. 그렇기 때문에 폴더 위치, 대체 이름, 파일 소유, 권한, 확장된 파일 속성 모두가 동일하게 유지됩니다.

    17 |

    또한, 권한을 유지하지 않기 때문에 조금 더 빠르게 진행됩니다.

    18 |
    19 |
    PNG: 임의의 정보 모두 제거하기
    20 |
    21 |

    웹에서 쓰일 파일을 최적화한다면 활성화하십시오. 만약 특정 메타데이터를 가진 PNG라면 비활성화하면 됩니다.

    22 |

    Other invisible information is removed as well, such as DPI and comments.

    23 |
    24 |
    JPEG: 파일의 코멘트와 EXIF 마크 제거하기
    25 |
    26 |

    색상 프로파일, 노출시간, GPS 좌표, 카메라 모델, 파일 생성 때 사용된 소프트웨어의 이름 등의 이미지 메타데이터를 제거합니다. 메타데이터는 JPEG 파일이 1.3MB 보다 크면 절대 지워지지 않습니다.

    27 |

    Embedded copyright information is removed as well. Please note that generally images are protected by copyright law regardless whether they contain such invisible metadata or not.

    28 |
    29 |
    30 |

    도구

    31 |

    Zopfli and PNGOUT are very good PNG compressors, but are very slow. Disable them if you need to optimize PNG files quickly (leave only AdvPNG for fastest, but still good compression).

    32 |

    Zopfli and OptiPNG will clean RGB values of transparent pixels (known as “dirty alpha”). Disable these two tools if you're optimizing special files that use alpha channel for something else than transparency (e.g. heightmap in game data files).

    33 |
    34 |

    JPEGOptim

    35 |
    36 |
    최대 품질
    37 |
    38 |

    만약 100%로 설정하면, 최적화는 손실없이 진행됩니다.

    39 |

    만약 기존 파일들이 더 높은 품질로 저장되었더라도, 최적화 품질을 100% 미만으로 설정하면 더 낮은 품질로 진행됩니다.

    40 |
    41 |
    42 |
    43 |
    44 |

    PNGOUT

    45 |
    46 |
    최적화 유형
    47 |
    48 |

    PNGOUT은 매우 효과적이지만 느립니다. 만약 참기 힘들다면 더 낮은 단계를 사용하세요.

    49 |
    50 |
    만약 너무 오랫동안 작업이 진행되면 중지시킵니다.
    51 |
    52 |

    PNGOUT은 매우 큰 이미지를 최적화하는데 많은시간이 소요될 수도 있습니다. 이 옵션은 1분이 지나고 PNGOUT을 깔끔하게 중지시킵니다.

    53 |
    54 |
    55 |
    56 |
    57 |

    OptiPNG

    58 |
    59 |
    Optimisation level
    60 |
    61 |

    Number of different setting combinations tested. It rarely makes sense to try them all.

    62 |
    63 |
    Make images interlaced (progressive)
    64 |
    65 |

    파일을 부분적으로 로드될 때 인터레이스 된 이미지는 보기 좋습니다. 하지만 대게 인터레이스는 압출은 덜 효과적입니다.

    66 |

    이 체크박스는 3가지 상태를 가집니다. 만약 체크되면 이미지를 인터레이스되도록 만들어집니다. 혼합으로 선택할 때에는 파일에 인터레이스를 변경하지 않습니다. 마지막으로 체크를 해제하면 파일에 인터레이스를 제거합니다.

    67 |
    68 |
    69 |
    70 |
    71 |

    Gifsicle

    72 |

    최고의 압축을 위해, 당신은 GIF파일을 PNG로 변환해야 합니다.(ImageOptime가 자동적으로 그것을 해주지 않습니다).

    73 |
    74 | 75 | 76 | -------------------------------------------------------------------------------- /imageoptim/ko.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@을 시작하지 못했습니다"; 3 | 4 | /* tooltip */ 5 | "All neccessary tools have been disabled in Preferences" = "환경설정 안에 있는 모든 필요한 도구들이 비활성화되었습니다"; 6 | 7 | /* tooltip, generic loading error */ 8 | "Can't open the file" = "메모리에 파일을 맵핑할 수 없습니다"; 9 | 10 | /* undo command name */ 11 | "Cut" = "잘라내기(X)"; 12 | 13 | /* tooltip */ 14 | "File cannot be optimized any further" = "더 이상 파일을 최적화 할 수 없습니다"; 15 | 16 | /* tooltip */ 17 | "File is neither PNG, GIF nor JPEG" = "파일 유형은 PNG, GIF, JPEG 중 하나이어야 합니다"; 18 | 19 | /* tooltip */ 20 | "Inspecting file" = "파일을 정검 중입니다."; 21 | 22 | /* newly added to the queue */ 23 | "New file" = "새 파일"; 24 | 25 | /* tooltip */ 26 | "Optimized file could not be saved" = "최적화된 파일은 저장될 수 없습니다"; 27 | 28 | /* tooltip */ 29 | "Optimized successfully with %@" = "%@로 최적화 성공"; 30 | 31 | /* total ratio, status bar */ 32 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "%@ 절약했습니다(전체 %@). 전체 %@ (파일 당 %@)"; 33 | 34 | /* per file avg, status bar */ 35 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "%@ 절약했습니다(전체 %@). 평균 파일 당 %@ (최대 %@)"; 36 | 37 | /* command name, tooltip */ 38 | "Started %@" = "%@로 시작했습니다"; 39 | 40 | /* tooltip */ 41 | "Waiting to be optimized" = "최적화하기 위해 기다리는 중"; 42 | 43 | /* tooltip */ 44 | "Waiting to start more optimizations" = "더 최적화시키기 위해 기다리는 중"; 45 | 46 | -------------------------------------------------------------------------------- /imageoptim/log.h: -------------------------------------------------------------------------------- 1 | // 2 | // log.h 3 | // ImageOptim 4 | 5 | extern int hideLogs; 6 | 7 | #define IODebug(...) if (!hideLogs) NSLog(@"" __VA_ARGS__); 8 | #define IOWarn(...) NSLog(@"" __VA_ARGS__); 9 | -------------------------------------------------------------------------------- /imageoptim/lt.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim by Kornel Lesiński and contributors is a GUI for 3rd party utilities:

    3 |
      4 |
    • 5 | OptiPNG by Cosmin Truta,
    • 6 |
    • 7 | PNGCrush by Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG by Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim by Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle by Eddie Kohler,
    • 16 |
    • and PNGOUT by Ken Silverman.
    • 17 |
    18 |

    ImageOptim can be redistributed and modified under GNU General Public License version 2 or later. 19 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    20 |
    21 | -------------------------------------------------------------------------------- /imageoptim/lt.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim Pagalba 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim

    11 | 12 |

    Kaip naudoti

    13 | 14 |
      15 |
    1. Nuvilkite PNG ar JPEG failus ar aplankus į pagrindinį ImageOptim'o langą.
    2. 16 | 17 |
    3. Palaukite kol pabaigs.
    4. 18 | 19 |
    5. Nauda! (iš mažų failų)
    6. 20 |
    21 |

    Jūs taip pat galite numesti failus ant ImageOptim'o Dock'o ikonos.

    22 | 23 |

    Sužinoti kaip keisti nustatymus.

    24 | 25 |

    Ikonos failų lentelėje

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Žalia varnelėPaveikslėlis buvo sėkmingai optimizuotas.
    Žalias XViskas praėjo sklandžiai, bet paveikslėlį neįmanoma optimizuoti labiau.
    Pilka žvaigždėVyksta failo optimizacija.
    Pilki taškiukaiFailas pridėtas į eilę ir optimizavimas prasidės kai susitvarkys su kitais failais.
    Oranžinis šauktukasOptimizacijos metu įvyko klaida. Paaiškinimus rasite paleidus Console.app.
    54 |

    Kaip tai veikia

    55 | 56 |

    ImageOptim yra šių programų grafinė sąsaja (GUI):

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • ir pasirinktinai PNGOUT.
    • 70 |
    71 |

    ImageOptim paleidžia juos ir automatiškai pasirenka mažiausią failą.

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/lt.lproj/Help/prefs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim nustatymai 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim nustatymai

    11 |

    « Atgal į pradžią

    12 |

    Bendri nustatymai

    13 |
    14 |
    Išsaugoti failų teisęs, parametrus ir nuorodas
    15 |
    16 |

    Vietoj to kad ištrinti seną failą ir įrašinėti naują tuo pačiu pavadinimu, tiesiog pakeičia seno failo turinį. Tai užtikrina kad visos nuorodos, santraukos, failo savininkai, leidimai ir išplėstiniai parametrai lieka nepasikeitę.

    17 |

    Šiek tiek greičiau nesaugoti leidimų.

    18 |
    19 |
    Pašalinti galimas santraukas
    20 |
    21 |

    Įjunkite jeigu optimizuojate žiniatinkliui. Išjunkite jeigu turite ypatingus PNG failus su papildomais meta duomenimis.

    22 |

    Other invisible information is removed as well, such as DPI and comments.

    23 |
    24 |
    Ištrinti EXIF žymes iš failų
    25 |
    26 |

    Pašalina paveikslėlio meta duomenys, tokius kaip spalvų profilis, išlaikymo trukmė, GPS koordinatės, fotoaparato modelis ir programinės įrangos naudotos sukūrimui pavadinimas.

    27 |

    Embedded copyright information is removed as well. Please note that generally images are protected by copyright law regardless whether they contain such invisible metadata or not.

    28 |
    29 |
    30 |

    Tools

    31 |

    Zopfli and PNGOUT are very good PNG compressors, but are very slow. Disable them if you need to optimize PNG files quickly (leave only AdvPNG for fastest, but still good compression).

    32 |

    Zopfli and OptiPNG will clean RGB values of transparent pixels (known as “dirty alpha”). Disable these two tools if you're optimizing special files that use alpha channel for something else than transparency (e.g. heightmap in game data files).

    33 |
    34 |

    JPEGOptim

    35 |
    36 |
    Aukščiausia kokybė
    37 |
    38 |

    Jeigu nustatyta 100%, optimizacija bus lossless.

    39 |

    Betkas žemiau 100% duos žemesnes kokybės kokybės failus atrodančius lyg jie būtu išsaugoti su aukštesniais kokybės nustatymais.

    40 |
    41 |
    42 |
    43 |
    44 |

    PNGOUT

    45 |
    46 |
    Optimizacijos tipas
    47 |
    48 |

    PNGOUT labai efektyvus, bet labai lėtas. Jeigu esate nekantrus naudokite žemesnę kokybę.

    49 |
    50 |
    Nutraukti jeigu užtrunka per ilgai
    51 |
    52 |

    PNGOUT gali prireikti labai daug laiko optimizuojant didelis failus. Šis nustatymas grakščiai sutrugdys PNGOUT po vienos minutes.

    53 |
    54 |
    55 |
    56 |
    57 |

    OptiPNG

    58 |
    59 |
    Optimizacijos lygis
    60 |
    61 |

    Didelis kiekis nustatymų jau išbandyta. Retai kada visu bandymas turi prasmės.

    62 |
    63 |
    Padaryti paveikslėlius supintais (progressive interlace)
    64 |
    65 |

    Supinti paveikslėliai atrodo geriau kai jie dalinai užkrauti, bet dažniausiai supynimas neigiamai įtakoja kompresijos efektyvumui.

    66 |

    Ši varnelė turi tris padėtis: jeigu pažymėta, tai priverstinai supina paveikslėlis. Jeigu mišriai, tai nekeis supynimo nustatymus. Jeigu nuimta, tai pašalins supynimus iš failų.

    67 |
    68 |
    69 |
    70 |
    71 |

    Gifsicle

    72 |

    Geriausiam suspaudimui, reikėtu konvertuoti GIF failus Į PNG (ImageOptim automatiškai to ne daro).

    73 |
    74 | 75 | 76 | -------------------------------------------------------------------------------- /imageoptim/lt.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "Įvyko klaida paleidžiant %@"; 3 | 4 | /* undo command name */ 5 | "Add" = "Pridėti"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Visi reikalingi įrankiai buvo atjungti nustatymuose"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Neįmanoma priskirti failo atmintyje"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Iškirpti"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Labiau optimizuoti failo neįmanoma"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Failas nėra PNG, GIF ar JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Tikrinam failą"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Naujas failas"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Neįmanoma išsaugoti optimizuoto failo"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Sėkmingai optimizuota naudojant %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Išsaugota %@ iš %@. %@ viso (iki %@ vienam failui)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Išsaugota %@ iš %@. %@ vidutiniškai vienam failui (iki %@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Paleidom %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Laukia optimizacijos"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Laukiama optimizacijų pradžios"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by porneL on 7.wrz.07. 3 | // 4 | 5 | int quitWhenDone = 0; 6 | int hideLogs = 0; 7 | 8 | #import 9 | #import 10 | 11 | static int isLaunchedWithCliArguments(int argc, char *argv[]) { 12 | // Unfortunately NSApplicationLaunchIsDefaultLaunchKey doesn't cover bare CLI launch 13 | if (argc < 2) return 0; 14 | for (int i=0; i < argc; i++) { 15 | if ('-' == argv[i][0]) { // Normal OS X launch sets -psn 16 | return 0; 17 | } 18 | } 19 | return 1; 20 | } 21 | 22 | int main(int argc, char *argv[]) { 23 | quitWhenDone = hideLogs = isLaunchedWithCliArguments(argc, argv); 24 | 25 | return NSApplicationMain(argc, (const char **) argv); 26 | } 27 | -------------------------------------------------------------------------------- /imageoptim/makehelp.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | shopt -s nullglob 3 | LANG=$1 4 | 5 | SRC=$LANG.lproj/Help/ 6 | DST=$LANG.lproj/Help/Help.helpindex 7 | 8 | TMP=/tmp/helpindex-$LANG 9 | 10 | echo "Making $LANG to $DST" 11 | 12 | test -d "$TMP" || mkdir "$TMP" 13 | 14 | for i in ${SRC}*.html; do 15 | tidy --tidy-mark no --show-errors 0 -q -utf8 -asxhtml < "$i" > "$TMP/`basename "$i"`"; 16 | done; 17 | 18 | hiutil -C -ag -m 1 -v -s "$LANG" -f "$DST" "$TMP" 19 | -------------------------------------------------------------------------------- /imageoptim/nl.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim door Kornel Lesiński is een GUI voor losstaande programma’s:

    3 |
      4 |
    • 5 | OptiPNG van Cosmin Truta,
    • 6 |
    • 7 | PNGCrush van Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG van Andrea Mazzoleni en Filipe Estima,
    • 12 |
    • 13 | Jpegoptim van Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle van Eddie Kohler,
    • 16 |
    • en PNGOUT van Ken Silverman.
    • 17 |
    18 |

    ImageOptim kan herverdeeld en gewijzigd worden volgens de 19 | GNU General Public License, versie 2 of later. 20 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    21 |

    Nederlandse vertaling door by Mathias Bynens.

    22 |
    23 | -------------------------------------------------------------------------------- /imageoptim/nl.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ImageOptim Help 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |

    ImageOptim

    14 | 15 |

    Hoe te gebruiken

    16 | 17 |
      18 |
    1. Sleep PNG- of JPEG-bestanden of mappen naar het hoofdscherm van ImageOptim.
    2. 19 | 20 |
    3. Wacht totdat de optimalisatie voltooid is.
    4. 21 | 22 |
    5. Voilà, de bestanden zijn compacter in bestandsgrootte!
    6. 23 |
    24 |

    Het is ook mogelijk om bestanden of mappen naar het ImageOptim-icoon in je Dock te slepen.

    25 | 26 |

    Voorkeuren aanpassen.

    27 | 28 |

    Icoontjes in de bestandstabel

    29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |
    Groene checkmarkHet optimaliseren van de afbeelding is geslaagd.
    Groene XDe afbeelding kon niet verder geoptimaliseerd worden.
    Grijze sterDit bestand wordt momenteel geoptimaliseerd.
    Grijze bolletjesHet bestand staat in de wachtrij De optimalisatie zal beginnen zodra de andere bestanden geoptimaliseerd zijn..
    Oranje uitroepingstekenEr ging iets mis tijdens de optimalisatie. Voor meer info over wat er precies fout liep, open Console.app.
    57 |

    Hoe werkt het?

    58 | 59 |

    ImageOptim is een front-end (GUI) voor volgende applicaties:

    60 | 61 |
      62 |
    • OptiPNG
    • 63 | 64 |
    • PNGCrush
    • 65 | 66 |
    • AdvPNG
    • 67 | 68 |
    • JpegOptim
    • 69 | 70 |
    • JpegTran
    • 71 | 72 |
    • en eventueel PNGOUT.
    • 73 |
    74 |

    ImageOptim laat deze programma’s los op de gekozen bestanden, en selecteert vervolgens automatisch het kleinste resulterende bestand.

    75 | 76 | 77 | -------------------------------------------------------------------------------- /imageoptim/nl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ kon niet starten"; 3 | 4 | /* undo command name */ 5 | "Add" = "Voeg toe"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Alle benodigde programma’s zijn uitgeschakeld via Voorkeuren"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Het bestand kon niet in het geheugen ingelezen worden"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Knip"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Het bestand kan niet verder geoptimaliseerd worden"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Het bestand is noch PNG noch JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Bezig met analyseren van bestand"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Nieuw bestand"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Het geoptimaliseerde bestand kon niet bewaard worden"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "De optimalisatie is geslaagd (%@)"; 33 | 34 | /* command name, tooltip */ 35 | "Started %@" = "%@ gestart"; 36 | 37 | /* tooltip */ 38 | "Waiting to be optimized" = "Klaar om geoptimaliseerd te worden"; 39 | 40 | /* tooltip */ 41 | "Waiting to start more optimizations" = "Wachten op verdere optimalisaties"; 42 | 43 | -------------------------------------------------------------------------------- /imageoptim/no.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim av Kornel Lesiński er et grafisk grensesnitt for følgende tredjepartsverktøy:

    3 |
      4 |
    • 5 | OptiPNG av Cosmin Truta,
    • 6 |
    • 7 | PNGCrush av Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG av Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim av Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle by Eddie Kohler,
    • 16 |
    • og PNGOUT av Ken Silverman.
    • 17 |
    18 |

    ImageOptim kan fritt redistributes og endres under 19 | GNU General Public License versjon 2 eller senere. 20 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    21 |

    22 | Oversatt til norsk av Henrik Helmers 23 |

    24 | -------------------------------------------------------------------------------- /imageoptim/no.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hjelp for ImageOptim 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim

    11 | 12 |

    Hvordan bruke

    13 | 14 |
      15 |
    1. Dra og slipp PNG- eller JPEG-filer eller mapper på ImageOptim.
    2. 16 | 17 |
    3. Vent til bildene er behandlet.
    4. 18 | 19 |
    5. Suksess!
    6. 20 |
    21 |

    Du kan også slippe filer på Dock-ikonet til ImageOptim, eller bruke støttede filers høyreklikkmeny.

    22 | 23 |

    Lær mer om Valg.

    24 | 25 |

    Ikonbruk i tabellen

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Grønn VBildet har blitt optimalisert, og størrelsen redusert.
    Grønn XAlt gikk som det skulle, men bildet kunne ikke gjøres mindre.
    Grå spinnerFilen optimaliseres nå.
    Grå prikkerFilen ligger i køen.
    Oransje utropstegnDet oppstod en feil under optimaliseringen. Du kan finne flere detaljer i Console.app.
    54 |

    Hvordan det virker

    55 | 56 |

    ImageOptim er et grafisk grensesnitt for disse verktøyene:

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • og PNGOUT, dersom det er installert.
    • 70 |
    71 |

    ImageOptim kjører dem alle, og velger den minste filen blant den de produserer.

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/no.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ kunne ikke startes"; 3 | 4 | /* undo command name */ 5 | "Add" = "Legg til"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Alle nødvendige verktøy er slått av i Valg"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Kan ikke laste fil til minnet"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Klipp ut"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Filen kan ikke optimaliseres videre"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Filen er verken en PNG eller JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Inspiserer fil"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Ny fil"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Optimalisert fil kunne ikke lagres"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Vellykket optimalisering med %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Saved %1$@ out of %2$@. %3$@ overall (up to %4$@ per file)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Saved %1$@ out of %2$@. %3$@ per file on average (up to %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Bearbeider %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Venter på å bli optimalisert"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Venter med å starte ytterligere optimalisering"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/noopt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/noopt.png -------------------------------------------------------------------------------- /imageoptim/noopt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/noopt@2x.png -------------------------------------------------------------------------------- /imageoptim/ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/ok.png -------------------------------------------------------------------------------- /imageoptim/ok@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/ok@2x.png -------------------------------------------------------------------------------- /imageoptim/pl.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim Kornela Lesińskiego i współpra-cowników to nakładka na następujące programy:

    3 |
      4 |
    • 5 | OptiPNG Cosmina Truty,
    • 6 |
    • 7 | PNGCrush Glenna Randers-Pehrsona,
    • 8 |
    • 9 | Zopfli Jyrki Alakuijaly i Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG Andrei Mazzoleni i Filipe Estimy,
    • 12 |
    • 13 | Jpegoptim Timo Kokkonena,
    • 14 |
    • 15 | Gifsicle Eddiego Kohlera,
    • 16 |
    • oraz PNGOUT Kena Silvermana.
    • 17 |
    18 |

    ImageOptim może być modyfikowany i rozpowszechniany na zasadach 19 | GNU General Public License wersji 2 lub nowszej. 20 | PNGOUT nie jest objęty GPL i został dołączony za pozwoleniem Ardfry Imaging, LLC.

    21 |
    22 | -------------------------------------------------------------------------------- /imageoptim/pl.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pomoc programu ImageOptim 4 | 5 | 6 | 7 | 8 | 9 |

    ImageOptim

    10 | 11 |

    Jak tego użyć

    12 | 13 |
      14 |
    1. Przeciągnij i upuść plik PNG, JPEG lub ścieżkę pliku do tabeli w oknie ImageOptim.
    2. 15 | 16 |
    3. Poczekaj, aż do zakończenia procesu.
    4. 17 | 18 |
    5. Zysk! (z mniejszych plików)
    6. 19 |
    20 |

    Możesz upuścić plik do ikony dokowania ImageOptim.

    21 | 22 |

    Dowiedz się, jak zmienić preferencje.

    23 | 24 |

    Ikony w tabeli plików

    25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
    Green CheckmarkObraz został zoptymalizowany poprawnie.
    Green XWszystko poszło dobrze, ale obraz nie może być zoptymalizowany.
    Gray starOptymalizacja pliku w toku.
    Gray dotsPlik zostanie zoptymalizowany po zakończeniu pracy nad innymi plikami.
    Orange exclamation markWystąpił błąd podczas optymalizacji. Znajdziesz wyjaśnienie uruchamiając Console.app.
    53 |

    Jak to działa

    54 | 55 |

    ImageOptim jest początkiem (GUI) dla tych aplikacji:

    56 | 57 |
      58 |
    • OptiPNG
    • 59 | 60 |
    • PNGCrush
    • 61 | 62 |
    • AdvPNG
    • 63 | 64 |
    • JpegOptim
    • 65 | 66 |
    • JpegTran
    • 67 | 68 |
    • i opcjonalnie PNGOUT.
    • 69 |
    70 |

    ImageOptim po uruchomieniu wybiera najmniejszy plik.

    71 | 72 | 73 | -------------------------------------------------------------------------------- /imageoptim/pl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "Nie udało się uruchomić %@"; 3 | 4 | /* undo command name */ 5 | "Add" = "Dodaj"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Niezbędne narzędzia zostały wyłączone w Preferencjach"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Nie udało się załadować pliku"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Wytnij"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Plik już był maksymalnie zoptymalizowany"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Plik nie jest typu PNG, GIF ani JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Sprawdzam plik"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Nowo dodany"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Nie udało się zapisać zoptymalizowanej wersji"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Zoptymalizowano za pomocą %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Oszczędzono %@ z %@. W sumie %@ (niektóre pliki do %@)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Oszczędzono %@ z %@. Średnio %@ na plik (aż do %@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Rozpoczęto %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Oczekuje na optymalizację"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Oczekuje na kolejną rundę optymalizacji"; 48 | 49 | "%@+%@" = "%@ i %@"; 50 | 51 | -------------------------------------------------------------------------------- /imageoptim/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/progress.png -------------------------------------------------------------------------------- /imageoptim/progress@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/progress@2x.png -------------------------------------------------------------------------------- /imageoptim/pt-BR.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    O ImageOptim por Kornel Lesiński é uma interface gráfica para utilidades de terceiros:

    3 |
      4 |
    • 5 | OptiPNG por Cosmin Truta,
    • 6 |
    • 7 | PNGCrush por Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG por Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim por Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle por Eddie Kohler,
    • 16 |
    • e PNGOUT por Ken Silverman.
    • 17 |
    18 |

    O ImageOptim pode ser distribuído e modificado sob a 19 | GNU General Public License versão 2 ou posterior. 20 | Bundled PNGOUT is not 21 | covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    22 |

    Traduzido por Luiz Menezes Jr

    23 |
    24 | -------------------------------------------------------------------------------- /imageoptim/pt-BR.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Ajuda do ImageOptim 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim

    11 | 12 |

    Como usar

    13 | 14 |
      15 |
    1. Arrastar e soltar arquivos PNG e JPEG, ou pastas, no centro da janela do ImageOptim.
    2. 16 | 17 |
    3. Espere até que termine.
    4. 18 | 19 |
    5. Pronto! (arquivos menores)
    6. 20 |
    21 |

    Também pode arrastar e soltar os arquivos no ícone do ImageOptim no dock.

    22 | 23 |

    Saiba como alterar as Preferências.

    24 | 25 |

    Ícones na lista de arquivos

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Green CheckmarkA otimização da imagem terminou com sucesso.
    Green XCorreu tudo bem, mas não foi possível otimizar a imagem para além do seu estado atual.
    Gray starA optimização deste arquivo está em progresso.
    Gray dotsO arquivo está em espera para ser otimizado, logo que outros arquivos acabarem de ser processados.
    Orange exclamation markOcorreu um erro durante a otimização. Encontrará mais detalhes ao executar a aplicação 'terminal'.
    54 |

    Como é que funciona

    55 | 56 |

    O ImageOptim é uma interface gráfica (GUI) para estas aplicações:

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • e opcionalmente o PNGOUT.
    • 70 |
    71 |

    O ImageOptim executa-as e automaticamente escolhe o arquivo menor.

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/pt-BR.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "O %@ falhou ao iniciar"; 3 | 4 | /* undo command name */ 5 | "Add" = "Adicionar"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Todas as ferramentas necessárias foram desativadas nas Preferências"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Não foi possível mapear o arquivo na memória"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Cortar"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "O arquivo não pode ser melhor otimizado"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "O arquivo não é PNG ou JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Analisando arquivo"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Novo arquivo"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Não foi possível salvar o arquivo otimizado"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Optimizado com sucesso com o %@"; 33 | 34 | /* command name, tooltip */ 35 | "Started %@" = "Iniciado o %@"; 36 | 37 | /* tooltip */ 38 | "Waiting to be optimized" = "Aguardando para ser otimizado"; 39 | 40 | /* tooltip */ 41 | "Waiting to start more optimizations" = "Aguardando para iniciar mais otimizações"; 42 | 43 | -------------------------------------------------------------------------------- /imageoptim/pt.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    O ImageOptim por Kornel Lesiński é uma GUI para utilidades de terceiros:

    3 |
      4 |
    • 5 | OptiPNG por Cosmin Truta,
    • 6 |
    • 7 | PNGCrush por Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG por Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim por Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle por Eddie Kohler,
    • 16 |
    • e PNGOUT por Ken Silverman.
    • 17 |
    18 |

    O ImageOptim pode ser distribuído e modificado sob a 19 | GNU General Public License versão 2 ou posterior. 20 | Bundled PNGOUT is not 21 | covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    22 |
    23 | -------------------------------------------------------------------------------- /imageoptim/pt.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Ajuda do ImageOptim 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim

    11 | 12 |

    Como usar

    13 | 14 |
      15 |
    1. Arrastar e largar ficheiros PNG e JPEG, ou pastas, na tabela principal da janela do ImageOptim.
    2. 16 | 17 |
    3. Aguardar até que termine.
    4. 18 | 19 |
    5. Lucrar! (com ficheiros mais pequenos)
    6. 20 |
    21 |

    Também pode largar os ficheiros no ícone do ImageOptim na Dock.

    22 | 23 |

    Saiba como alterar Preferências.

    24 | 25 |

    Ícones na tabela de ficheiros

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Green CheckmarkA optimização da imagem terminou com sucesso.
    Green XCorreu tudo bem, mas não foi possível optimizar a imagem para além do seu estado actual.
    Gray starA optimização deste ficheiro está em progresso.
    Gray dotsO ficheiro está em espera para ser optimizado, logo que outros ficheiros acabem de ser processados.
    Orange exclamation markOcorreu um erro durante a optimização. Irá encontrar mais detalhes ao executar a aplicação Consola.
    54 |

    Como é que funciona

    55 | 56 |

    O ImageOptim é uma interface gráfica (GUI) para estas aplicações:

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • e opcionalmente o PNGOUT.
    • 70 |
    71 |

    O ImageOptim executa-as e automaticamente escolhe o ficheiro mais pequeno.

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/pt.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "O %@ falhou ao iniciar"; 3 | 4 | "All neccessary tools have been disabled in Preferences" = "Todas as ferramentas necessárias foram desactivadas nas Preferências"; 5 | 6 | /* tooltip, generic loading error */ 7 | "Can't open the file" = "Não é possivel mapear o ficheiro para memória"; 8 | 9 | /* undo command name */ 10 | "Cut" = "Cortar"; 11 | 12 | /* tooltip */ 13 | "File cannot be optimized any further" = "O ficheiro não pode ser optimizado para além do estado actual"; 14 | 15 | /* tooltip */ 16 | "File is neither PNG, GIF nor JPEG" = "O ficheiro não é PNG ou JPEG"; 17 | 18 | /* tooltip */ 19 | "Inspecting file" = "A inspeccionar ficheiro"; 20 | 21 | /* newly added to the queue */ 22 | "New file" = "Novo ficheiro"; 23 | 24 | /* tooltip */ 25 | "Optimized file could not be saved" = "Não foi possível guardar o ficheiro optimizado"; 26 | 27 | /* tooltip */ 28 | "Optimized successfully with %@" = "Optimizado com sucesso com o %@"; 29 | 30 | /* command name, tooltip */ 31 | "Started %@" = "Iniciado o %@"; 32 | 33 | /* tooltip */ 34 | "Waiting to be optimized" = "A aguardar para ser optimizado"; 35 | 36 | /* tooltip */ 37 | "Waiting to start more optimizations" = "A aguardar para iniciar mais optimizações"; 38 | 39 | -------------------------------------------------------------------------------- /imageoptim/release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_SEARCH_USER_PATHS = NO; 2 | ARCHS = x86_64; 3 | VALID_ARCHS = x86_64; 4 | DEAD_CODE_STRIPPING = YES; 5 | DEPLOYMENT_POSTPROCESSING = YES; 6 | GCC_FAST_MATH = YES; 7 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO; 8 | GCC_INLINES_ARE_PRIVATE_EXTERN = YES; 9 | GCC_PREPROCESSOR_DEFINITIONS = NDEBUG NS_BLOCK_ASSERTIONS; 10 | GCC_STRICT_ALIASING = YES; 11 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 12 | GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; 13 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 14 | GCC_WARN_UNUSED_FUNCTION = YES; 15 | GCC_WARN_UNUSED_LABEL = YES; 16 | GCC_WARN_UNUSED_VALUE = YES; 17 | GCC_WARN_UNUSED_VARIABLE = YES; 18 | MACOSX_DEPLOYMENT_TARGET = 10.6.8; 19 | ONLY_ACTIVE_ARCH = NO; 20 | DEBUG_INFORMATION_FORMAT = dwarf-with-dsym 21 | PLIST_FILE_OUTPUT_FORMAT = binary; 22 | SDKROOT = macosx; 23 | STRINGS_FILE_OUTPUT_ENCODING = UTF-8; 24 | COPY_PHASE_STRIP = NO; 25 | -------------------------------------------------------------------------------- /imageoptim/ru.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim Корнела Лесински (Kornel Lesiński) и других участников является ГПИ(графическим пользовательским интерфейсом) для утилит и инструментов третей стороны

    3 |
      4 |
    • 5 | OptiPNG Космина Труты (Cosmin Truta),
    • 6 |
    • 7 | PNGCrush Гленна Рандерс-Персона (Glenn Randers-Pehrson),
    • 8 |
    • 9 | Zopfli Юрки Алакуйхала (Jyrki Alakuijala), Лода Вандевенна (Lode Vandevenne),
    • 10 |
    • 11 | AdvPNG Андреа Маццолени (Andrea Mazzoleni), Филлипа Эстима (Filipe Estima),
    • 12 |
    • 13 | Jpegoptim Тимо Кокконена (Timo Kokkonen),
    • 14 |
    • 15 | Gifsicle Эдди Колера (Eddie Kohler),
    • 16 |
    • и PNGOUT Кена Сильвермана (Ken Silverman).
    • 17 |
    18 |

    ImageOptim может распространяться и подвергаться изменениям в соответствии с лицензией GNU General Public License v.2 (и её более поздними редакциями).⏎ 19 | Bundled PNGOUT не имеет лицензии GPL и включена в ПО с разрешения Ardfry Imaging, LLC.

    20 |

    Осуществил перевод на русский язык Millennium

    21 |
    22 | -------------------------------------------------------------------------------- /imageoptim/ru.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Справка ImageOptim 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim

    11 | 12 |

    Как использовать

    13 | 14 |
      15 |
    1. Перетяните PNG или JPEG файлы или папки в главное окно программы ImageOptim.
    2. 16 | 17 |
    3. Дождитесь окончания.
    4. 18 | 19 |
    5. Профит! (файлы уменьшились в размере)
    6. 20 |
    21 |

    Вы так же можете перетягивать файлы на значек ImageOptim в Dock.

    22 | 23 |

    Узнайте как можно изменить настройки.

    24 | 25 |

    Иконки в таблице файлов

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Зеленая галочкаИзображение было успешно оптимизировано.
    Зеленый крестВсе прошло хорошо, но изображение не получается сделать более оптимизированым.
    Серая звездаОптимизация этого файла в процессе.
    Серые точкиФайл в очереди и будет оптимизирован после того, как закончат остальные файлы.
    Оранжевый восклицательный знакВо время оптимизации произошла ошибка. Вы найдете объяснение запустив приложение Консоль.
    54 |

    Как это работает

    55 | 56 |

    ImageOptim является графическим интерфейсом для этих приложений:

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • и опционально PNGOUT.
    • 70 |
    71 |

    ImageOptim запускает их и автоматически выбирает самый маленький файл.

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ сбой при запуске"; 3 | 4 | /* undo command name */ 5 | "Add" = "Добавить"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Все необходимые инструменты были отключены в Настройках"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Не могу загрузить файл в память"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Вырезать"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Файл не может быть более оптимизирован"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Файл не является PNG, GIF или JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Проверка файла"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Новый файл"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Оптимизированный файл не может быть сохранен"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Успешно оптимизированно используя %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Сэкономлено %1$@ из %2$@. %3$@ всего (до %4$@ на файл)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Сэкономлено %1$@ из %2$@. %3$@ в среднем на файл (до %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Начато %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Ожидание оптимизици"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Ожидание начала дальнейших оптимизаций"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/sign_update.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | if ARGV.length < 2 3 | puts "Usage: ruby sign_update.rb update_archive private_key" 4 | exit 5 | end 6 | 7 | puts `openssl dgst -sha1 -binary < "#{ARGV[0]}" | openssl dgst -dss1 -sign "#{ARGV[1]}" | openssl enc -base64` -------------------------------------------------------------------------------- /imageoptim/style.css: -------------------------------------------------------------------------------- 1 | html {font: 10pt/1.2 "Lucida Grande",sans-serif; margin:0;padding:0} 2 | body {margin:0;padding:10px} 3 | a[name]{display:none} 4 | dt {font-weight:bold;} 5 | dd {margin:0.2em 0 0;padding:0 0 0 1em;} 6 | dd p:first-child {margin-top:0;} 7 | div:target {background:#eef} 8 | 9 | h1 {margin:-10px -10px 0;background:#ddd; padding:0.2em;border-bottom:#aaa 1px solid; text-shadow: 0 1px 1px white} 10 | h2,h3,h4 {margin:1em 0 0.5em;} 11 | 12 | #jpegoptim, #advpng, #optipng, #pngout,#pngcrush,#gifsicle,#jpegrescan {display:inline-block; width:45%; border-top:1px solid #eee; background:#fdfdfd; padding:0 1% 1em; margin: 1em 2% 1em 0; vertical-align:top} 13 | 14 | 15 | @media screen and (min-width:1100px) 16 | { 17 | #jpegoptim, #advpng, #optipng, #pngout,#pngcrush,#gifsicle,#jpegrescan {width:27%} 18 | } -------------------------------------------------------------------------------- /imageoptim/sv.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim av Kornel Lesiński och medarbetare är ett grafiskt gränssnitt för följande verktyg:

    3 |
      4 |
    • 5 | OptiPNG av Cosmin Truta,
    • 6 |
    • 7 | PNGCrush av Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG av Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim av Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle av Eddie Kohler,
    • 16 |
    • och PNGOUT av Ken Silverman.
    • 17 |
    18 |

    ImageOptim får distribueras och modifieras under 19 | GNU General Public License version 2 eller senare. PNGOUT täcks 20 | inteav GPL och medföljer med tillstånd från Ardfry Imaging, LLC.

    21 |

    Översättning av Peeter Sällström Randsalu.

    22 |
    23 | -------------------------------------------------------------------------------- /imageoptim/sv.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim Hjälp 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim

    11 | 12 |

    Användning

    13 | 14 |
      15 |
    1. Dra filer i PNG- eller JPEG-format eller mappar till ImageOptims huvudfönster.
    2. 16 | 17 |
    3. Vänta tills det är klart.
    4. 18 | 19 |
    5. Vinst! (genom mindre filer)
    6. 20 |
    21 |

    Man kan också dra filer till ImageOptims ikon i Dockan.

    22 | 23 |

    Hur inställningarna fungerar.

    24 | 25 |

    Ikoner i filvyn

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Green CheckmarkBilden har optimerats.
    Green XAllt gick bra, men bilden kunde inte optimeras mer.
    Gray starFilen håller på att optimeras.
    Gray dotsFilen står i kö för att optimeras när alla andra filer är klara.
    Orange exclamation markNågot blev fel under optimeringen. Kör Systemmeddelanden.app för att få en förklaring.
    54 |

    Hur fungerar det?

    55 | 56 |

    ImageOptim är ett grafiskt gränssnitt (GUI) för följande program:

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • och eventuellt PNGOUT.
    • 70 |
    71 |

    ImageOptim kör programmen och väljer automatiskt den minsta filen.

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/sv.lproj/Help/prefs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim Inställningar 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim Inställningar

    11 |

    « Tillbaka

    12 |

    Allmänna inställningar

    13 |
    14 |
    Behåll filbehörigheter, attribut och hårda länkar
    15 |
    16 |

    Byter ut den gamla filen mot en ny fil på plats. Det gör att alla hårda länkar, alias och filens ägare, behörigheter och utökade attribut förblir desamma.

    17 |

    Det går lite snabbare om man inte behåller behörigheter.

    18 |
    19 |
    Ta bort alla valfria stycken
    20 |
    21 |

    Behåll förkryssad om du optimerar för webben. Stäng av om du har speciella PNG-filer med extra metadata.

    22 |

    Other invisible information is removed as well, such as DPI and comments.

    23 |
    24 |
    Ta bort EXIF-data och kommentarer från filer
    25 |
    26 |

    Tar bort bildens metadata, som namnet på bildbehandlingsprogrammet eller på kameramodellen som skapade filen.

    27 |

    Embedded copyright information is removed as well. Please note that generally images are protected by copyright law regardless whether they contain such invisible metadata or not.

    28 |
    29 |
    30 |

    Tools

    31 |

    Zopfli and PNGOUT are very good PNG compressors, but are very slow. Disable them if you need to optimize PNG files quickly (leave only AdvPNG for fastest, but still good compression).

    32 |

    Zopfli and OptiPNG will clean RGB values of transparent pixels (known as “dirty alpha”). Disable these two tools if you're optimizing special files that use alpha channel for something else than transparency (e.g. heightmap in game data files).

    33 |
    34 |

    JPEGOptim

    35 |
    36 |
    Maxkvalitet
    37 |
    38 |

    Om det står på 100%, blir det en icke-förstörande komprimering.

    39 |

    Allt under 100% skapar filer av lägre kvalitet än om de sparas med den högsta inställningen.

    40 |
    41 |
    42 |
    43 |
    44 |

    PNGOUT

    45 |
    46 |
    Optimeringstyp
    47 |
    48 |

    PNGOUT är väldigt effektivt, men väldigt långsamt. Använd lägre värden om du är otålig.

    49 |
    50 |
    Avbryt om det tar för lång tid
    51 |
    52 |

    PNGOUT kan ta lång tid på sig för att optimera stora bilder. Den här inställningen avbryter PNGOUT efter en minut.

    53 |
    54 |
    55 |
    56 |
    57 |

    OptiPNG

    58 |
    59 |
    Optimeringsnivå
    60 |
    61 |

    Det finns ett antal olika inställningskombinationer. Det är oftast inte lönt att prova alla.

    62 |
    63 |
    Sammanfläta bilder (progressivt)
    64 |
    65 |

    Sammanflätade bilder ser bättre ut när de är delvis nedladdade, men komprimeringen blir oftast mindre effektiv.

    66 |

    Det finns tre möjligheter: en bock gör att alla bilder blir sammanflätade, ett streck behåller filens inställningar, och en tom ruta tar bort sammanflätning från filer.

    67 |
    68 |
    69 |
    70 |
    71 |

    Gifsicle

    72 |

    För bästa komprimering bör du konvertera GIF-filer till PNG-filer (ImageOptim gör inte detta automatiskt).

    73 |
    74 | 75 | 76 | -------------------------------------------------------------------------------- /imageoptim/sv.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "%@ kunde inte startas"; 3 | 4 | /* undo command name */ 5 | "Add" = "Lägg till"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Alla verktyg som behövs har stängts av i inställningarna"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Kan inte läsa in filen i minnet"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Klipp ut"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Det går inte att optimera filen mer"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Filen är varken i PNG- eller JPG-format"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Inspekterar fil"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Ny fil"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Den optimerade filen kunde inte sparas"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Optimering med %@ lyckades"; 33 | 34 | /* command name, tooltip */ 35 | "Started %@" = "%@ har startat"; 36 | 37 | /* tooltip */ 38 | "Waiting to be optimized" = "Väntar på optimering"; 39 | 40 | -------------------------------------------------------------------------------- /imageoptim/tr.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim Kornel Lesiński ve katkısı bulunan 3. parti yazılımlar için bir GUI'dir:

    3 |
      4 |
    • 5 | OptiPNG by Cosmin Truta,
    • 6 |
    • 7 | PNGCrush by Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG by Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim by Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle by Eddie Kohler,
    • 16 |
    • and PNGOUT by Ken Silverman.
    • 17 |
    18 |

    ImageOptim yeniden dağıtılabilir ve üzerinde değişiklik yapılabilir, ancak GNU özgür belgeleme sürüm 2 veya üstü lisansıyla. Paketli PNGOUT GPL kapsamında değildir ve Ardfry Imaging, LLC izniyle dahil edilmiştir.

    19 |
    20 | -------------------------------------------------------------------------------- /imageoptim/tr.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | ImageOptim Yardım 4 | 5 | 6 | 7 | 8 | 9 |

    ImageOptim

    10 | 11 |

    Kullanım

    12 | 13 |
      14 |
    1. PNG veya JPEG dosyaları veya klasörlerini ImageOptim penceresinin ana tablo görüntüsüne sürükle ve bırak.
    2. 15 | 16 |
    3. Bitirene kadar bekle.
    4. 17 | 18 |
    5. Kazanç! (küçük dosyalardan)
    6. 19 |
    20 |

    Dosyaları ImageOptim'in Dock simgesine de sürükleyebilirsiniz.

    21 | 22 |

    Seçenekleri nasıl değiştireceğini öğren.

    23 | 24 |

    Dosya tablosundaki simgeler

    25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
    Yeşil Seçim İşaretiResim başarıyla optimize edildi.
    Yeşil XHerşey yolunda, ancak resim daha fazla optimize edilemiyor.
    Gri yıldızBu dosyanın optimizasyonu devam ediyor.
    Gri noktacıklarDiğer dosyalar bittikten sonra optimize edilmesi için sıraya alındı.
    Turuncu ünlem işaretiOptimizasyon sırasında hata oluştu. Hata açıklamasını Console.app yazılımıyla görebilirsiniz.
    53 |

    Nasıl işler

    54 | 55 |

    ImageOptim şu yazılımları çalıştıran bir arayüzdür (GUI):

    56 | 57 |
      58 |
    • OptiPNG
    • 59 | 60 |
    • PNGCrush
    • 61 | 62 |
    • AdvPNG
    • 63 | 64 |
    • JpegOptim
    • 65 | 66 |
    • JpegTran
    • 67 | 68 |
    • ve tercihli olarak PNGOUT.
    • 69 |
    70 |

    ImageOptim bunları çalıştırır ve otomatik olarak en küçük dosyayı seçer.

    71 | 72 | 73 | -------------------------------------------------------------------------------- /imageoptim/tr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* undo command name */ 2 | "Add" = "Ekle"; 3 | 4 | /* tooltip */ 5 | "All neccessary tools have been disabled in Preferences" = "Gerekli tüm araçlar Tercihlerde devre dışı bırakılmıştır"; 6 | 7 | /* tooltip, generic loading error */ 8 | "Can't open the file" = "Dosya hafızaya yerleştirilemiyor"; 9 | 10 | /* undo command name */ 11 | "Cut" = "Kes"; 12 | 13 | /* tooltip */ 14 | "File cannot be optimized any further" = "Dosya bundan fazla optimize edilemez"; 15 | 16 | /* tooltip */ 17 | "File is neither PNG, GIF nor JPEG" = "Dosya ne PNG, GIF, ne de JPEG"; 18 | 19 | /* tooltip */ 20 | "Inspecting file" = "Dosya inceleniyor"; 21 | 22 | /* newly added to the queue */ 23 | "New file" = "Yeni dosya"; 24 | 25 | /* tooltip */ 26 | "Optimized file could not be saved" = "Optimize edilmiş dosya kaydedilemedi"; 27 | 28 | /* tooltip */ 29 | "Optimized successfully with %@" = "%@ optimizasyonu başarıyla tamamlandı"; 30 | 31 | /* total ratio, status bar */ 32 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "%2$@ üzerinden %1$@ tasarruf edildi. Toplamda %3$@ (dosya başına %4$@ kadar)"; 33 | 34 | /* per file avg, status bar */ 35 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "%2$@ üzerinden %1$@ tasarruf edildi. Dosya başına ortalama %3$@ (%4$@ kadar)"; 36 | 37 | /* command name, tooltip */ 38 | "Started %@" = "%@ işlemi başladı"; 39 | 40 | /* tooltip */ 41 | "Waiting to be optimized" = "Optimize edilmeyi bekliyor"; 42 | 43 | /* tooltip */ 44 | "Waiting to start more optimizations" = "Daha fazla optimizasyon için bekliyor"; 45 | 46 | -------------------------------------------------------------------------------- /imageoptim/update_appcast.php: -------------------------------------------------------------------------------- 1 | load($appcastpath); 22 | 23 | $xp = new DOMXPath($feed); 24 | $xp->registerNamespace("sparkle",SPARKLE_NS); 25 | 26 | $item = $xp->query("//item[enclosure/@sparkle:version='$exactVersion']")->item(0); 27 | 28 | if (!$item) 29 | { 30 | $item = getElement($feed->getElementsByTagName('channel')->item(0),"item"); 31 | newline($item); 32 | } 33 | 34 | setText(getElement($item, "title"), "Version $niceVersion"); 35 | setText(getElement($item, "pubDate"), date(DATE_RSS)); 36 | setText(getElement($item, "sparkle:minimumSystemVersion", SPARKLE_NS), $minOSVersion); 37 | getElement($item, "description"); 38 | 39 | $enc = getElement($item, "enclosure"); 40 | $enc->setAttributeNS(SPARKLE_NS, "sparkle:version", $exactVersion); 41 | $enc->setAttribute("url", $download_url); 42 | $enc->setAttribute("length", filesize($archivepath)); 43 | $enc->setAttributeNS(SPARKLE_NS, "sparkle:dsaSignature", signUpdate($archivepath, $pempath)); 44 | 45 | 46 | file_put_contents($appcastpath, $feed->saveXML()); 47 | 48 | 49 | function readKey($name) 50 | { 51 | $plistpath = realpath('Info.plist'); 52 | $domain = preg_replace('/\.plist$/','',$plistpath); 53 | 54 | return system("defaults read ".escapeshellarg($domain)." ".escapeshellarg($name)); 55 | } 56 | 57 | function getElement(DOMElement $parent, $tagname, $ns = NULL) 58 | { 59 | if ($ns !== NULL) $el = $parent->getElementsByTagNameNS($ns, preg_replace('/^.*:/','',$tagname))->item(0); 60 | else $el = $parent->getElementsByTagName($tagname)->item(0); 61 | 62 | if (!$el) 63 | { 64 | $el = $parent->ownerDocument->createElementNS($ns, $tagname); 65 | $parent->appendChild($el); 66 | newline($parent); 67 | } 68 | 69 | return $el; 70 | } 71 | 72 | 73 | function newline(DOMElement $parent) 74 | { 75 | $parent->appendChild($parent->ownerDocument->createTextNode("\n")); 76 | } 77 | 78 | function setText(DOMElement $el, $textcontent) 79 | { 80 | while($el->firstChild) $el->removeChild($el->firstChild); 81 | 82 | if (strlen($textcontent)) 83 | { 84 | $el->appendChild($el->ownerDocument->createTextNode($textcontent)); 85 | } 86 | } 87 | 88 | function signUpdate($archivepath, $pempath) 89 | { 90 | return system("ruby sign_update.rb ".escapeshellarg($archivepath)." ".escapeshellarg($pempath)); 91 | } 92 | -------------------------------------------------------------------------------- /imageoptim/vi.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim lập trình bởi Kornel Lesiński và các cộng sự từ các hãng thứ 3 khác:

    3 |
      4 |
    • 5 | OptiPNG bởi Cosmin Truta,
    • 6 |
    • 7 | PNGCrush bởi Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli bởi Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG bởi Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim bởi Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle bởi Eddie Kohler,
    • 16 |
    • and PNGOUT bởi Ken Silverman.
    • 17 |
    18 |

    ImageOptim có thể được phân phối và tái chỉnh sửa dựa theo GNU General Public License version 2 hoặc các phiên bản mới hơn về giấy phép. Bundled PNGOUT không thuộc phần giấy phép GPL và thuộc bản quyền của công ty Ardfry Imaging, LLC.

    19 |

    Chuyển ngữ tiếng Việt (Phan Anh)

    20 |
    21 | -------------------------------------------------------------------------------- /imageoptim/vi.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Trợ giúp chương trình 4 | 5 | 6 | 7 | 8 | 9 |

    Tùy chỉnh hình ảnh

    10 | 11 |

    How to use

    12 | 13 |
      14 |
    1. Drag'n'drop PNG or JPEG files or directories onto main table view in ImageOptim's window.
    2. 15 | 16 |
    3. Wait until it finishes.
    4. 17 | 18 |
    5. Profit! (from smaller files)
    6. 19 |
    20 |

    You can also drop files onto ImageOptim's Dock icon.

    21 | 22 |

    Learn how to change Preferences.

    23 | 24 |

    Icons in file table

    25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
    Green CheckmarkImage has been optimized successfully.
    Green XEverything went fine, but image couldn't be optimized any further.
    Gray starOptimization of this file is in progress.
    Gray dotsFile is queued to be optimized after other files are finished.
    Orange exclamation markThere was an error during optimization. You'll find explanation by running Console.app.
    53 |

    How does it work

    54 | 55 |

    ImageOptim is a front-end (GUI) for these applications:

    56 | 57 |
      58 |
    • Tùy chỉnh PNG
    • 59 | 60 |
    • PNGCrush
    • 61 | 62 |
    • PNG nâng cao
    • 63 | 64 |
    • JpegOptim
    • 65 | 66 |
    • JpegTran
    • 67 | 68 |
    • and optionally PNGOUT.
    • 69 |
    70 |

    ImageOptim runs them and automatically selects smallest file.

    71 | 72 | 73 | -------------------------------------------------------------------------------- /imageoptim/vi.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* tooltip */ 2 | "%@ failed to start" = "bị lỗi khi khởi động %@"; 3 | 4 | /* undo command name */ 5 | "Add" = "Thêm vào"; 6 | 7 | /* tooltip */ 8 | "All neccessary tools have been disabled in Preferences" = "Tất cả các công cụ cần thiết đều bị vô hiệu hóa trong Tùy Biến"; 9 | 10 | /* tooltip, generic loading error */ 11 | "Can't open the file" = "Không thể tải tập tin vào trong bộ nhớ để xử lý"; 12 | 13 | /* undo command name */ 14 | "Cut" = "Cắt"; 15 | 16 | /* tooltip */ 17 | "File cannot be optimized any further" = "Tập tin không thể được tùy chỉnh thêm nữa"; 18 | 19 | /* tooltip */ 20 | "File is neither PNG, GIF nor JPEG" = "Tập tin phải ở dạng PNG, GIF hoặc JPEG"; 21 | 22 | /* tooltip */ 23 | "Inspecting file" = "Đang tìm hiểu về tập tin"; 24 | 25 | /* newly added to the queue */ 26 | "New file" = "Tập tin mới"; 27 | 28 | /* tooltip */ 29 | "Optimized file could not be saved" = "Không thể lưu tập tin đã được tùy chỉnh hóa"; 30 | 31 | /* tooltip */ 32 | "Optimized successfully with %@" = "Đã tùy chỉnh hóa thành công với %@"; 33 | 34 | /* total ratio, status bar */ 35 | "Saved %@ out of %@. %@ overall (up to %@ per file)" = "Đã lưu %1$@ của tổng cộng %2$@. %3$@ toàn bộ (lên tới %4$@ với mỗi tập tin)"; 36 | 37 | /* per file avg, status bar */ 38 | "Saved %@ out of %@. %@ per file on average (up to %@)" = "Đã lưu %1$@ trong tổng số %2$@. %3$@ trung bình cho mỗi tập tin (lên tới %4$@)"; 39 | 40 | /* command name, tooltip */ 41 | "Started %@" = "Đã bắt đầu %@"; 42 | 43 | /* tooltip */ 44 | "Waiting to be optimized" = "Đang đợi để được tùy chỉnh hóa"; 45 | 46 | /* tooltip */ 47 | "Waiting to start more optimizations" = "Đang đợi để bắt đầu các phần tùy chỉnh khác"; 48 | 49 | -------------------------------------------------------------------------------- /imageoptim/wait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/wait.png -------------------------------------------------------------------------------- /imageoptim/wait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JohnWong/ImageOptim/cf4b69b015259e80dc2dab48765d4dd591ac8c6e/imageoptim/wait@2x.png -------------------------------------------------------------------------------- /imageoptim/zh-Hant.lproj/Credits.html: -------------------------------------------------------------------------------- 1 |
    2 |

    ImageOptim by Kornel Lesiński and contributors is a GUI for 3rd party utilities:

    3 |
      4 |
    • 5 | OptiPNG by Cosmin Truta,
    • 6 |
    • 7 | PNGCrush by Glenn Randers-Pehrson,
    • 8 |
    • 9 | Zopfli by Jyrki Alakuijala, Lode Vandevenne,
    • 10 |
    • 11 | AdvPNG by Andrea Mazzoleni, Filipe Estima,
    • 12 |
    • 13 | Jpegoptim by Timo Kokkonen,
    • 14 |
    • 15 | Gifsicle by Eddie Kohler,
    • 16 |
    • and PNGOUT by Ken Silverman.
    • 17 |
    18 |

    ImageOptim can be redistributed and modified under GNU General Public License version 2 or later. 19 | Bundled PNGOUT is not covered by the GPL and is included with permission of Ardfry Imaging, LLC.

    20 |
    21 | -------------------------------------------------------------------------------- /imageoptim/zh-Hant.lproj/Help/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ImageOptim Help 5 | 6 | 7 | 8 | 9 | 10 |

    ImageOptim

    11 | 12 |

    使用方法

    13 | 14 |
      15 |
    1. 拖放PNG,JPEG檔案或是資料夾至ImageOptim視窗中的檔案列表
    2. 16 | 17 |
    3. 等待處理完成
    4. 18 | 19 |
    5. 得到好處! (因為檔案變小了)
    6. 20 |
    21 |

    你也可以拖放檔案至Dock圖示上

    22 | 23 |

    變更偏好設定

    24 | 25 |

    檔案列表中的圖示

    26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
    Green Checkmark成功地最佳化圖片
    Green X圖片沒什麼問題,只是不能再縮小了
    Gray star正在最佳化這張圖片
    Gray dots待其他圖片最佳化完成後,處理這張圖片
    Orange exclamation mark最佳化處理時有錯誤發生。 欲取得說明請執行Console.app
    54 |

    最佳化原理

    55 | 56 |

    ImageOptim為下列應用程式的前端介面(GUI):

    57 | 58 |
      59 |
    • OptiPNG
    • 60 | 61 |
    • PNGCrush
    • 62 | 63 |
    • AdvPNG
    • 64 | 65 |
    • JpegOptim
    • 66 | 67 |
    • JpegTran
    • 68 | 69 |
    • PNGOUT(選用).
    • 70 |
    71 |

    ImageOptim執行這些應用程式並自動選擇最小的檔案輸出。

    72 | 73 | 74 | -------------------------------------------------------------------------------- /imageoptim/zh-Hant.lproj/Help/prefs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | ImageOptim 偏好設定 4 | 5 | 6 | 7 | 8 | 9 |

    ImageOptim 偏好設定

    10 |

    « 回到主頁

    11 |

    一般設定

    12 |
    13 |
    保留檔案權限、屬性及永久連結
    14 |
    15 |

    並非刪除舊檔案再寫入同名的新檔案,而是直接取代原始檔案的內容。這樣可以保證所有的永久連結、檔案別名、檔案擁有者及權限或是其他檔案屬性維持原樣。

    16 |

    不保留檔案權限的話,處理速度會快一點。

    17 |
    18 |
    清除所有輔助資料塊
    19 |
    20 |

    如果你是為了網頁而最佳化,那麼請啟用它吧。若你需要PNG的額外訊息,就請關閉。

    21 |

    Other invisible information is removed as well, such as DPI and comments.

    22 |
    23 |
    移除EXIF訊息及註解
    24 |
    25 |

    移除圖片的額外訊息(影像色域空間、曝光時間、GPS座標、相機型號、產生此檔案的應用程式等等)。

    26 |

    Embedded copyright information is removed as well. Please note that generally images are protected by copyright law regardless whether they contain such invisible metadata or not.

    27 |
    28 |
    29 |

    Tools

    30 |

    Zopfli and PNGOUT are very good PNG compressors, but are very slow. Disable them if you need to optimize PNG files quickly (leave only AdvPNG for fastest, but still good compression).

    31 |

    Zopfli and OptiPNG will clean RGB values of transparent pixels (known as “dirty alpha”). Disable these two tools if you're optimizing special files that use alpha channel for something else than transparency (e.g. heightmap in game data files).

    32 |
    33 |

    JPEGOptim

    34 |
    35 |
    最佳品質
    36 |
    37 |

    設定為100%時,為無損壓縮

    38 |

    設定為100%以下時,會導致影像品質下降

    39 |
    40 |
    41 |
    42 |
    43 |

    PNGOUT

    44 |
    45 |
    Optimization type
    46 |
    47 |

    PNGOUT is very effective, but very slow. Use lower level if you're impatient.

    48 |
    49 |
    Interrupt if takes too long
    50 |
    51 |

    PNGOUT可能需要大量的時間來處理較大的圖片檔案。此選項啟用後,會將超過一分鐘處理時間的最佳化處理優雅地中斷。

    52 |
    53 |
    54 |
    55 |
    56 |

    OptiPNG

    57 |
    58 |
    最佳化程度
    59 |
    60 |

    設定組合的測試數量。基本上不需測試所有的組合。

    61 |
    62 |
    交錯化圖片
    63 |
    64 |

    當圖片部份載入時,交錯式圖片有較好的顯示。但交錯化可能讓壓縮率較為低下。

    65 |

    這個核取方塊有三種狀態: 為選取時,會生成交錯化的圖片。為半選時,檔案的交錯化屬性不變。未選取時,會移除交錯化。

    66 |
    67 |
    68 |
    69 |
    70 |

    Gifsicle

    71 |

    為了更好的壓縮率,請將GIF轉成PNG檔案。(ImageOptim並不會自動幫你做這件事。)

    72 |
    73 | 74 | 75 | -------------------------------------------------------------------------------- /imageoptim/zh-Hant.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* undo command name */ 2 | "Add" = "新增"; 3 | 4 | /* undo command name */ 5 | "Cut" = "剪下"; 6 | 7 | /* tooltip */ 8 | "File cannot be optimized any further" = "檔案無法進一步最佳化"; 9 | 10 | /* newly added to the queue */ 11 | "New file" = "新文件"; 12 | 13 | /* tooltip */ 14 | "Optimized file could not be saved" = "無法儲存最佳化後的檔案"; 15 | 16 | /* tooltip */ 17 | "Optimized successfully with %@" = "利用%@成功最佳化檔案"; 18 | 19 | /* tooltip */ 20 | "Waiting to be optimized" = "檔案最佳化中"; 21 | 22 | /* tooltip */ 23 | "Waiting to start more optimizations" = "等候其他最佳化處理"; 24 | 25 | -------------------------------------------------------------------------------- /jpegoptim/Makefile: -------------------------------------------------------------------------------- 1 | 2 | jpegoptim.c: 3 | curl http://www.kokkonen.net/tjko/src/jpegoptim-1.2.4.tar.gz | tar xz --strip-components=1 --exclude=Makefile 4 | 5 | clean: 6 | 7 | install: 8 | 9 | -------------------------------------------------------------------------------- /jpegoptim/config.h: -------------------------------------------------------------------------------- 1 | /* config.h. Generated automatically by configure. */ 2 | /* config.h.in. 3 | * $Id: config.h.in,v 1.2 2002/12/04 13:17:58 tjko Exp $ 4 | * 5 | */ 6 | 7 | 8 | /* Define if you have the ANSI C header files. */ 9 | #define STDC_HEADERS 1 10 | 11 | /* The number of bytes in a int. */ 12 | #define SIZEOF_INT 4 13 | 14 | /* The number of bytes in a long. */ 15 | #define SIZEOF_LONG 8 16 | 17 | /* Define if you have the getopt_long function. */ 18 | #define HAVE_GETOPT_LONG 1 19 | 20 | /* Define if you have the header file. */ 21 | #define HAVE_GETOPT_H 1 22 | 23 | /* Define if you have the header file. */ 24 | #define HAVE_STRING_H 1 25 | 26 | /* Define if you have the header file. */ 27 | #define HAVE_UNISTD_H 1 28 | 29 | /* Define if you have the header file. */ 30 | #define HAVE_LIBGEN_H 1 31 | 32 | /* Define if you have the jpeg library (-ljpeg). */ 33 | /* #undef HAVE_LIBJPEG */ 34 | 35 | 36 | 37 | /* Define if you have broken jmorecfg.h (SGI's usually have this problem) */ 38 | /* #undef BROKEN_METHODDEF */ 39 | 40 | #define HOST_TYPE "i386-apple-darwin10.2.0" 41 | 42 | 43 | /* eof */ 44 | -------------------------------------------------------------------------------- /libjpeg/Makefile: -------------------------------------------------------------------------------- 1 | 2 | jpeglib.h: 3 | curl http://www.ijg.org/files/jpegsrc.v8.tar.gz | tar xz --strip-components=1 4 | -patch -p0 -i remove_unused_features.diff 5 | 6 | clean: 7 | 8 | install: 9 | -------------------------------------------------------------------------------- /libjpeg/jconfig.h: -------------------------------------------------------------------------------- 1 | /* jconfig.h. Generated from jconfig.cfg by configure. */ 2 | /* jconfig.cfg --- source file edited by configure script */ 3 | /* see jconfig.txt for explanations */ 4 | 5 | #define HAVE_PROTOTYPES 1 6 | #define HAVE_UNSIGNED_CHAR 1 7 | #define HAVE_UNSIGNED_SHORT 1 8 | /* #undef void */ 9 | /* #undef const */ 10 | /* #undef CHAR_IS_UNSIGNED */ 11 | #define HAVE_STDDEF_H 1 12 | #define HAVE_STDLIB_H 1 13 | /* #undef NEED_BSD_STRINGS */ 14 | /* #undef NEED_SYS_TYPES_H */ 15 | /* #undef NEED_FAR_POINTERS */ 16 | /* #undef NEED_SHORT_EXTERNAL_NAMES */ 17 | /* Define this if you get warnings about undefined structures. */ 18 | /* #undef INCOMPLETE_TYPES_BROKEN */ 19 | 20 | #ifdef JPEG_INTERNALS 21 | 22 | /* #undef RIGHT_SHIFT_IS_UNSIGNED */ 23 | #define INLINE __inline__ 24 | /* These are for configuring the JPEG memory manager. */ 25 | /* #undef DEFAULT_MAX_MEM */ 26 | /* #undef NO_MKTEMP */ 27 | 28 | #endif /* JPEG_INTERNALS */ 29 | 30 | #ifdef JPEG_CJPEG_DJPEG 31 | 32 | /* #undef TWO_FILE_COMMANDLINE */ 33 | /* #undef NEED_SIGNAL_CATCHER */ 34 | /* #undef DONT_USE_B_MODE */ 35 | 36 | /* Define this if you want percent-done progress reports from cjpeg/djpeg. */ 37 | /* #undef PROGRESS_REPORT */ 38 | 39 | #endif /* JPEG_CJPEG_DJPEG */ 40 | -------------------------------------------------------------------------------- /libjpeg/remove_unused_features.diff: -------------------------------------------------------------------------------- 1 | --- jmorecfg.h 2009-11-20 08:01:24.000000000 +0000 2 | +++ jmorecfg.h 2010-02-20 11:51:29.000000000 +0000 3 | @@ -268,7 +268,7 @@ 4 | /* Capability options common to encoder and decoder: */ 5 | 6 | #define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ 7 | -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ 8 | +#undef DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ 9 | #define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ 10 | 11 | /* Encoder capability options: */ 12 | @@ -293,11 +293,11 @@ 13 | #define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ 14 | #define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ 15 | #define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ 16 | -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ 17 | +#undef IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ 18 | #define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ 19 | -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ 20 | +#undef BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ 21 | #undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ 22 | -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ 23 | +#undef UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ 24 | #define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ 25 | #define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ 26 | 27 | -------------------------------------------------------------------------------- /libpng/Makefile: -------------------------------------------------------------------------------- 1 | 2 | VERSION=0.6.5 3 | OPTIPNG_FILENAME=optipng-$(VERSION).tar.gz 4 | 5 | png.h: /tmp/$(OPTIPNG_FILENAME) 6 | tar xzf /tmp/$(OPTIPNG_FILENAME) --strip-components=3 --exclude=Makefile optipng-$(VERSION)/lib/libpng 7 | 8 | /tmp/$(OPTIPNG_FILENAME): 9 | curl -L http://downloads.sourceforge.net/project/optipng/OptiPNG/optipng-$(VERSION)/$(OPTIPNG_FILENAME) -o /tmp/$(OPTIPNG_FILENAME) 10 | 11 | clean: 12 | test \! -e png.h || rm *.c png.h 13 | 14 | install: 15 | -------------------------------------------------------------------------------- /optipng/Makefile: -------------------------------------------------------------------------------- 1 | 2 | VERSION=0.6.5 3 | OPTIPNG_FILENAME=optipng-$(VERSION).tar.gz 4 | 5 | all: patched 6 | 7 | patched: src/optipng.c 8 | patch -p1 -i remove_nonpng_formats.patch || exit 1 9 | patch -p1 -i dirtyalpha.patch || exit 1 10 | touch patched 11 | 12 | src/optipng.c: /tmp/$(OPTIPNG_FILENAME) 13 | tar xzf /tmp/$(OPTIPNG_FILENAME) --strip-components=1 optipng-$(VERSION)/src optipng-$(VERSION)/lib/pngxtern 14 | 15 | /tmp/$(OPTIPNG_FILENAME): 16 | curl -L http://downloads.sourceforge.net/project/optipng/OptiPNG/optipng-$(VERSION)/$(OPTIPNG_FILENAME) -o /tmp/$(OPTIPNG_FILENAME) 17 | 18 | clean: 19 | - rm -rf ./patched ./src/ ./lib/ 20 | 21 | install: 22 | -------------------------------------------------------------------------------- /optipng/remove_nonpng_formats.patch: -------------------------------------------------------------------------------- 1 | diff --git a/lib/pngxtern/pngxread.c b/lib/pngxtern/pngxread.c 2 | index e0744d3..a3fc2db 100644 3 | --- a/lib/pngxtern/pngxread.c 4 | +++ b/lib/pngxtern/pngxread.c 5 | @@ -79,10 +79,8 @@ pngx_read_image(png_structp png_ptr, png_infop info_ptr, 6 | { 7 | png_byte sig[128]; 8 | size_t num; 9 | - int (*read_fn)(png_structp, png_infop, FILE *); 10 | FILE *stream; 11 | fpos_t fpos; 12 | - int result; 13 | 14 | /* Precondition. */ 15 | #ifdef PNG_FLAG_MALLOC_NULL_MEM_OK 16 | @@ -110,26 +108,5 @@ pngx_read_image(png_structp png_ptr, png_infop info_ptr, 17 | } 18 | return 1; 19 | } 20 | - 21 | - /* Check the signature bytes against other known image formats. */ 22 | - if (pngx_sig_is_bmp(sig, num, fmt_name, fmt_description) > 0) 23 | - read_fn = pngx_read_bmp; 24 | - else if (pngx_sig_is_gif(sig, num, fmt_name, fmt_description) > 0) 25 | - read_fn = pngx_read_gif; 26 | - else if (pngx_sig_is_jpeg(sig, num, fmt_name, fmt_description) > 0) 27 | - read_fn = pngx_read_jpeg; 28 | - else if (pngx_sig_is_pnm(sig, num, fmt_name, fmt_description) > 0) 29 | - read_fn = pngx_read_pnm; 30 | - else if (pngx_sig_is_tiff(sig, num, fmt_name, fmt_description) > 0) 31 | - read_fn = pngx_read_tiff; 32 | - else 33 | - return 0; /* not a known image format */ 34 | - 35 | - /* Read the image. */ 36 | - result = read_fn(png_ptr, info_ptr, stream); 37 | - /* Signature checking may give false positives; reading can still fail. */ 38 | - if (result <= 0) /* this isn't the format we thought it was */ 39 | - if (fsetpos(stream, &fpos) != 0) 40 | - png_error(png_ptr, "Can't fseek in input file stream"); 41 | - return result; 42 | + return 0; 43 | } 44 | -------------------------------------------------------------------------------- /pngcrush/Makefile: -------------------------------------------------------------------------------- 1 | VERSION=1.7.77 2 | PNGCRUSH_FILENAME=pngcrush-$(VERSION)-nolib.tar.gz 3 | 4 | .PHONY: all 5 | 6 | all: pngcrush.c 7 | 8 | pngcrush.c: pngcrush.patch 9 | curl -L http://softlayer-sng.dl.sourceforge.net/project/pmt/pngcrush/old-versions/1.7/$(VERSION)/$(PNGCRUSH_FILENAME) -o /tmp/$(PNGCRUSH_FILENAME) 10 | tar xzf /tmp/$(PNGCRUSH_FILENAME) --strip-components=1 --exclude=Makefile --exclude=Makefile.solaris 11 | -rm png.h pngconf.h 2>/dev/null 12 | patch -p1 < pngcrush.patch 13 | 14 | clean: 15 | -rm *.c *.h 2>/dev/null 16 | 17 | install: 18 | -------------------------------------------------------------------------------- /pngcrush/pngcrush.patch: -------------------------------------------------------------------------------- 1 | diff --git a/pngcrush.c b/pngcrush.c 2 | index 5a9db57..bc0add3 100644 3 | --- a/pngcrush.c 4 | +++ b/pngcrush.c 5 | @@ -1699,7 +1699,6 @@ static int overwrite = 0; /* overwrite the input file instead of creating 6 | a new output file */ 7 | static int nofilecheck = 0; 8 | static int no_limits = 0; 9 | -static int new_mng = 0; 10 | static png_bytep row_buf; 11 | #ifdef PNGCRUSH_MULTIPLE_ROWS 12 | static png_bytepp row_pointers; 13 | @@ -2627,7 +2626,6 @@ void pngcrush_write_png(png_structp write_pointer, png_bytep data, 14 | static void pngcrush_flush(png_structp png_ptr) 15 | { 16 | /* Do nothing. */ 17 | - PNGCRUSH_UNUSED(png_ptr) 18 | } 19 | 20 | 21 | @@ -7190,7 +7191,7 @@ png_uint_32 pngcrush_measure_idat(png_structp png_ptr) 22 | png_reset_crc(png_ptr); 23 | png_crc_read(png_ptr, chunk_name, 4); 24 | 25 | - if (new_mng) 26 | + if (0) 27 | { 28 | const png_byte png_DHDR[5] = { 68, 72, 68, 82, '\0' }; 29 | const png_byte png_DEFI[5] = { 68, 69, 70, 73, '\0' }; 30 | @@ -7357,7 +7357,7 @@ png_uint_32 pngcrush_measure_idat(png_structp png_ptr) 31 | } 32 | 33 | #ifdef PNG_UINT_acTL 34 | - else if (png_get_uint_32(chunk_name) == PNG_UINT_acTL) 35 | + if (png_get_uint_32(chunk_name) == PNG_UINT_acTL) 36 | #else 37 | else if (!png_memcmp(chunk_name, png_acTL, 4)) 38 | #endif 39 | @@ -7566,7 +7566,7 @@ png_uint_32 pngcrush_measure_idat(png_structp png_ptr) 40 | { 77, 69, 78, 68, '\0' }; 41 | if (!png_memcmp(chunk_name, png_MEND, 4)) 42 | { 43 | - if (new_mng) 44 | + if (0) 45 | { 46 | png_free(mng_ptr,bb); 47 | return (0); 48 | @@ -7638,6 +7638,7 @@ void print_version_info(void) 49 | * immediately after this sentence: */ 50 | " | Copyright (C) 1998-2002, 2006-2013 Glenn Randers-Pehrson\n" 51 | " | Portions copyright (C) 2005 Greg Roelofs\n" 52 | + " | Modified version for ImageOptim.\n" 53 | " | This is a free, open-source program. Permission is irrevocably\n" 54 | " | granted to everyone to use this version of pngcrush without\n" 55 | " | payment of any fee.\n" 56 | -------------------------------------------------------------------------------- /pngquant/Makefile: -------------------------------------------------------------------------------- 1 | PNGQUANT_GIT=git://github.com/pornel/pngquant.git 2 | 3 | all: src 4 | 5 | src: 6 | git clone --depth=1 $(PNGQUANT_GIT) ./src 7 | 8 | clean: 9 | -rm -rf ./src 10 | 11 | install: 12 | -------------------------------------------------------------------------------- /zlib/Makefile: -------------------------------------------------------------------------------- 1 | 2 | # zlib is not built here! It's included as part of libpng instead. 3 | 4 | VERSION=0.6.3 5 | 6 | zlib.h: 7 | curl -L http://downloads.sourceforge.net/project/optipng/OptiPNG/optipng-$(VERSION)/optipng-$(VERSION).tar.gz | tar xz --strip-components=3 --exclude=Makefile optipng-$(VERSION)/lib/zlib 8 | 9 | clean: 10 | 11 | install: -------------------------------------------------------------------------------- /zopfli-png/Makefile: -------------------------------------------------------------------------------- 1 | zopfli: 2 | git clone https://github.com/pornel/zopfli.git zopfli 3 | 4 | clean: 5 | rm -rf zopfli 6 | 7 | install: 8 | 9 | --------------------------------------------------------------------------------