خلاصه
برای دوستانی که حوصله خوندن متن طولانی رو ندارند:
برنامهای نوشتم که میتونه تعدادی فایل تصویری رو بگیره (در واقع عکسهاتون رو انتخاب کنید و بکشید روی آیکن این برنامه) و همه اونها رو به فرمت jpg تبدیل کنه، ابعادشون رو به حداکثر ۸۰۰ پیکسل کاهش بده، کیفیت شون رو برای آپلود در وب تا حدود ۸۰ درصد پایین بیاره و بعد با اسمی که شما تعیین میکنید از نو نامگذاریشون کنه. این برنامه احتیاجی به نصب شدن نداره و میتونید از اینجا دانلودش کنید.
به نظرم رسید که این ابزار میتونه برای خیلی از بلاگرها به دردبخور باشه. به همین دلیل گفتم اینجا منتشرش کنم و در موردش بنویسم تا شاید هم به درد کسی بخوره و هم ایراد و اشکالهایی که خودم ندیدم، بهم نشون داده بشه.
پیشزمینه
برای سری پستهای «دوز روزانه معماری» در وبلاگ معماریام، به صورت مداوم به تغییر ابعاد و اندازه عکسها، نامگذاری مجددشون براساس شماره پست (مثلا DDA-7-3 برای سومین عکس پست شماره ۷ دوز روزانه) و البته کاهش حجمشون (با کاهش کیفیت JPG تا ۸۰٪) نیاز داشتم اما:
۱- نامگذاری دستهای ویندوز به خاطر اون پرانتزهاش به دردم نمیخورد.
۲- حوصله باز کردن همزمان چندتا عکس توی Paint.NET، تغییر ابعادشون و ذخیره مجدد با کیفیت پایینتر رو نداشتم.
به همین دلیل اول برای حل مشکل نامگذاری یه برنامه Batch Rename برای خودم نوشتم. بعد هم یک برنامه برای تغییر ابعاد و فرمت عکسها و بعد تصمیم گرفتم هر دو برنامه رو با هم ادغام کنم و اسمش رو بگذارم BIRRC (مثلا سرنام Batch Image Rename,Resize and Convert) که خیلی هم خفن به نظر بیاید.
BIRRC
این برنامه رو به چند دلیل به جای پایتون (همراه با کتابخانه Pillow و شبهکامپایلر Pyinstaller) با Pure Basic نوشتم که بعدا توضیح میدم. خود برنامه رو میتونید از اینجا دانلود کنید (فعلا فقط نسخه ۶۴ بیتی) و این هم کد برنامه است:
OpenConsole()
UseJPEGImageEncoder()
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()
Print("Enter the constant part of file name:")
constantPart.s=Input()
numberOfFiles.i = CountProgramParameters()
iterator.i = 1
itLength = Int(Log10(numberOfFiles))+1
For i=0 To (numberOfFiles-1)
currentFile.s =ProgramParameter()
im = LoadImage(#PB_Any , currentFile)
If ImageHeight(im) > 800 Or ImageWidth(im) > 800
If ImageHeight(im) > ImageWidth(im)
newHeight.i = 800
newWidth.i = (800 * ImageWidth(im))/ImageHeight(im)
Else
newWidth.i = 800
newHeight.i = (800 * ImageHeight(im))/ImageWidth(im)
EndIf
ResizeImage(im , newWidth,newHeight)
EndIf
;;;File Operation
DeleteFile(currentFile)
newFile.s = GetPathPart(currentFile) + constantPart + RSet(Str(iterator), itLength ,"0") + ".jpg"
SaveImage(im , newFile,#PB_ImagePlugin_JPEG,7)
iterator = iterator + 1
Next
دلیل استفاده نکردن از پایتون هم این بود که اولا نصب Pillow و Pyinstaller روی آخرین نسخه پایتون (3.5) کاری ملالآوره و دوم اینکه فایل اجرایی حاصل هم حجم زیادی در حد ۸ مگابایت (در مقابل ۸۰۰ کیلوبایت فعلی) داشت.
شیوه استفاده
برنامه احتیاجی به نصب نداره. هرجا خواستید کپیاش کنید. اما برای راحتی کار میتونید یک shortcut براش روی دسکتاپ درست کنید. حالا فایلهای تصویری موردنظرتون رو انتخاب کرده و روی این برنامه یا shortcutاش بکشید و رها کنید.
بعد از اون پنجرهای باز میشه که از شما میخواد اسم جدید فایلها رو وارد کنید. بعد از وارد کردن اسم Enter بزنید.
و تمام. فایلهای شما به فرمت jpg تبدیل میشن، اسمشون تغییر میکنه و کیفیتشون هم کم میشه تا حجم فایلشون پایین بیاد. توی همین نمونه مثلا حجم عکسها از حدود ۳ مگابایت رسیده به ۶۷ کیلوبایت و اسمشون هم به BIRRC-1 تا BIRRC-5 تغییر کرده.
فقط دقت کنید که این برنامه فایلهای اصلی رو جایگزین میکنه. پس اگر بهشون احتیاج دارید قبل از کشیدنشون روی آیکون برنامه ازشون کپی بگیرید!
باگها
من برنامهنویس حرفهای نیستم. به همین دلیل ممکنه ایرادهای اساسی توی این برنامه وجود داشته باشه که خوشحال میشم بهم اعلامشون کنید. به همین دلیل این برنامه رو بدون تست کردن و آزمایش کافی برای کارهای اصلی و روزمره استفاده نکنید. به هر حال دو تا باگ اصلی که الان داره اینه که:
۱- اگر عکسهای شما از دوربین اومده باشند و توی EXIF عکسها متادیتای دوران دوربین وجود داشته باشه (دوربین روی عکس زاویه گرفته شدن رو ثبت کرده باشه) عکس بعد از تغییر اندازه دوران میکنه و ۹۰ درجه میچرخه.
۲- اگر وسط فایلهایی که روی روی برنامه میکشید فایلی غیر از عکس یا عکسی با فرمتهای غیرمعمول وجود داشته باشه، برنامه بدون هیچ پیغام خطایی اون فایل رو پاک میکنه.
به هر حال اگر از BIRRC استفاده کردید و خوشتون اومد یا به هر دلیلی مشکلی داشت و به درد نخورد یا هر چیز دیگهای خوشحال میشم بهم اطلاع بدید.