123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- #include <opencv2/opencv.hpp>
- #include <la_5.h>
- #define MO_DESQUEESE_100 0
- #define MO_DESQUEESE_125 1
- #define MO_DESQUEESE_133 2
- #define MO_DESQUEESE_150 3
- #define MO_DESQUEESE_160 4
- #define MO_DESQUEESE_200 5
- const float MO_DESQUEEZE_FACTOR[]={ 1.00, 1.25, 1.33, 1.50, 1.60, 2.00 };
- #define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))
- const char* MO_ACCEPT_FORMATS[5]={"jpg","jpeg","png","dng","tga"};
- STRUCTURE(OurMorphic){
- laSafeString* Directory;
- int DesqueezeFactor;
- };
- OurMorphic* Mo;
- extern "C" LA MAIN;
- int moinv_SelectDirectory(laOperator* a, laEvent* e){
- laInvoke(a, "LA_file_dialog", e, 0, "select=folder;", 0);
- return LA_RUNNING;
- }
- int momod_SelectDirectory(laOperator* a, laEvent* e){
- if (a->ConfirmData){
- if (a->ConfirmData->StrData){
- strSafeSet(&Mo->Directory,a->ConfirmData->StrData);
- laNotifyUsers("mo.directory");
- return LA_FINISHED_PASS;
- }
- return LA_FINISHED_PASS;
- }
- return LA_RUNNING;
- }
- int mo_AcceptImageFormat(char* fmt){
- char format[10]; strncpy(format,fmt,9); strToLower(format);
- const int count=LEN(MO_ACCEPT_FORMATS);
- for(int i=0;i<count;i++){
- if(strSame(format,MO_ACCEPT_FORMATS[i])) return 1;
- }
- return 0;
- }
- int moinv_DesqueezeSingle(char* file, char* output_file){ float fac=MO_DESQUEEZE_FACTOR[Mo->DesqueezeFactor];
- cv::Mat image = cv::imread(file, cv::IMREAD_ANYCOLOR);
- cv::Mat out_image;
- cv::resize(image,out_image,cv::Size(),fac,1.0,cv::INTER_LANCZOS4);
- cv::imwrite(output_file,out_image,{cv::IMWRITE_JPEG_QUALITY,100});
- }
- int mo_RunConversion(){
- logClear();
- if(Mo->DesqueezeFactor==0){
- logPrintNew("No need to desqueeze.\n"); return;
- }
- char Dir[2048];
- char Final[4096];
- char FinalOut[4096];
- strcpy(Dir,SSTR(Mo->Directory));
- #ifdef __linux__
- #ifdef LAGUI_ANDROID
- #define versionsort alphasort
- #endif
- int len=strlen(Dir);
- if (Dir[len - 1] != U'/') strcat(Dir, "/");
- struct dirent **NameList=0;
- int NumFiles=scandir(Dir,&NameList,0,versionsort);
- sprintf(FinalOut, "%sOurMorphicOut",Dir); mkdir(FinalOut,S_IRWXU | S_IRWXG | S_IRWXO); printf("%d\n",errno);
- for(int i=0;i<NumFiles;i++){
- struct dirent* d = NameList[i];
- if(!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")){ continue; }
- struct stat s;
- sprintf(Final, "%s%s",Dir,d->d_name);
- stat(Final, &s);
- if (!S_ISDIR(s.st_mode)){
- char *format = strGetLastSegment(d->d_name, '.');
- if(!mo_AcceptImageFormat(format)){ continue; }
- sprintf(FinalOut, "%sOurMorphicOut/%s",Dir,d->d_name);
- moinv_DesqueezeSingle(Final,FinalOut);
- logPrintNew("Done with %s\n",d->d_name);
- }
- }
- for (int i = 0; i < NumFiles; i++) { free(NameList[i]); } free(NameList);
- #endif
- #ifdef _WIN32
- WIN32_FIND_DATA FindFileData;
- HANDLE hFind;
- SYSTEMTIME stUTC, stLocal;
- if (Dir[len - 1] != U'\\') strcat(Dir, "\\*.*"); else strcat(Dir, "*.*");
- hFind = FindFirstFile(Dir, &FindFileData);
- sprintf(FinalOut, "%sOurMorphicOut",Dir); _mkdir(FinalOut);
- if (hFind == INVALID_HANDLE_VALUE){ logPrintNew("Error opening directory.\n"); return; }
- while (1) {
- if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
- char* format = strGetLastSegment(FindFileData.cFileName, '.');
- if(!mo_AcceptImageFormat(format)){ goto findnext; }
- sprintf(Final, "%s%s",Dir,FindFileData.cFileName);
- sprintf(FinalOut, "%sOurMorphicOut/%s",Dir,FindFileData.cFileName);
- moinv_DesqueezeSingle(Final,FinalOut);
- logPrintNew("Done with %s\n",FindFileData.cFileName);
- }
- findnext:
- if (!FindNextFile(hFind, &FindFileData)) break;
- }
- #endif
-
- return 1;
- }
- int moinv_RunConversion(laOperator* a, laEvent* e){
- mo_RunConversion();
- logPrintNew("All done.\n");
- return LA_FINISHED;
- }
- void moui_MainPanel(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
- laColumn* c=laFirstColumn(uil);
- laShowItemFull(uil,c,0,"mo.desqueeze_factor",0,0,0,0)->Flags|=LA_UI_FLAGS_EXPAND;
- laShowSeparator(uil,c);
- laUiItem* b=laBeginRow(uil,c,0,0);
- laShowItem(uil,c,0,"MO_select_directory");
- laShowSeparator(uil,c)->Expand=1;
- laShowItem(uil,c,0,"MO_run_conversion");
- laEndRow(uil,b);
- laShowItemFull(uil,c,0,"mo.directory",LA_WIDGET_STRING_MONO_PLAIN,0,0,0)->Flags|=LA_TEXT_LINE_WRAP|LA_TEXT_USE_NEWLINE;
- laShowSeparator(uil,c);
- laUiItem* g=laMakeGroup(uil,c,"123",0);{ g->State=LA_UI_ACTIVE; g->Flags|=LA_UI_FLAGS_PREFER_BOTTOM;
- laUiList* gu=g->Page; laColumn* gc=laFirstColumn(gu); gu->HeightCoeff=-1;
- laShowItem(gu,gc,0,"la.logs")->Flags|=LA_UI_FLAGS_NO_DECAL;
- }
- }
- void* moget_mo(void* unused,void* unused1){
- return Mo;
- }
- void moRegisterEverything(){
- laPropContainer* pc; laProp* p;
- laRegisterUiTemplate("MO_PANEL_morphic","Morphic",moui_MainPanel,0,0,"Tools",0,0,0);
- laCreateOperatorType("MO_select_directory","Select Directory","Select directory to operate on",0,0,0,moinv_SelectDirectory,momod_SelectDirectory,0,0);
- laCreateOperatorType("MO_run_conversion","Run Conversion","Run image conversion",0,0,0,moinv_RunConversion,0,0,0);
- pc=laDefineRoot();
- laAddSubGroup(pc,"mo","Morphic","Morphic","mo",0,0,0,-1,moget_mo,0,0,0,0,0,0,LA_UDF_SINGLE);
- pc=laAddPropertyContainer("mo","Morphic","Morphic",0,0,sizeof(OurMorphic),0,0,1);
- laAddStringProperty(pc,"directory","Directory","Opeartion directory",0,0,0,0,1,offsetof(OurMorphic,Directory),0,0,0,0,0);
- p=laAddEnumProperty(pc,"desqueeze_factor","Desqueeze Factor","Desqueeze factor",0,0,0,0,0,offsetof(OurMorphic,DesqueezeFactor),0,0,0,0,0,0,0,0,0,0);
- laAddEnumItemAs(p,"100","-","Don't do desqueeze",MO_DESQUEESE_100,0);
- laAddEnumItemAs(p,"125","1.25","Desqueeze 1.25 times",MO_DESQUEESE_125,0);
- laAddEnumItemAs(p,"133","1.33","Desqueeze 1.33 times",MO_DESQUEESE_133,0);
- laAddEnumItemAs(p,"150","1.50","Desqueeze 1.50 times",MO_DESQUEESE_150,0);
- laAddEnumItemAs(p,"160","1.60","Desqueeze 1.60 times",MO_DESQUEESE_160,0);
- laAddEnumItemAs(p,"200","2.00","Desqueeze 2.00 times",MO_DESQUEESE_200,0);
- }
- void moInit(){
- Mo=memAcquire(sizeof(OurMorphic));
- }
- int main(int argc, char** argv )
- {
- laInitArguments ia;
- laSetDefaultInitArguments(&ia);
- laGetReadyWith(&ia);
- moInit();
- moRegisterEverything();
- laEnsureUserPreferences();
- if(!MAIN.Windows.pFirst){
- laWindow* w=laDesignWindow(0,0,400,700);
- laLayout* l=laDesignLayout(w,"Default");
- laBlock* b=l->FirstBlock;
- laCreatePanel(b,"MO_PANEL_morphic");
- laStartWindow(w);
- }
- laMainLoop();
-
- return 0;
- }
|