GDI+を使用しjpg画像ピクセルサイズにより縦長と横長画像を分類する

icon 項目のみ表示/展開表示の切り替え

概要

GDI+を使うと簡単にjpgファイルが扱える。
お遊びとして、指定したフォルダーに含まれるjpgファイルの画像の大きさより縦長か、横長かを判定し、縦長ならそのフォルダのtateフォルダーへ、横長ならyokoフォルダーへ移動するプログラムを作成した。
GDI+を使用するためGDIPLUS.DLLが必要である。実行ファイル作成には、GDIPLUS.LIBが必要。

使い方(DOSプロンプトを開いてから)

jpgldirection [画像が入っているフォルダー名]

フォルダー名にたとえば d: のように指定するとd:\と解釈されますので注意指定ください。引数の数もチェックしていません。標準出力には変換されるファイル名とピクセルサイズが表示されます。UNICODE版は、標準出力へ出力する場合に、sjisに変換している点に注意してください。Unicodeのまま出力すると文字化けする。

ソース

ソースと実行ファイルのダウンロード

// jpgファイルを縦長と横長に分離
//       gdiplus.libをリンク gdiplus.dllが必要

#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
#include <direct.h>
#include <tchar.h>

using namespace Gdiplus;
GdiplusStartupInput gdiSI;
ULONG_PTR           gdiToken;


void get_jpeg_size(TCHAR* szFile,int *x,int *y){
#ifndef UNICODE
        WCHAR wTitle[256];
    MultiByteToWideChar(932,0,szFile,-1,wTitle,sizeof(wTitle)/sizeof(TCHAR));
    Image myImage(wTitle);
#else
    Image myImage(szFile);
#endif
        *x=myImage.GetWidth();
        *y=myImage.GetHeight();
}

// 最初に呼び出される関数

void _tmain(int argc,TCHAR** argv){
    GdiplusStartup(&gdiToken, &gdiSI, NULL);
        WIN32_FIND_DATA FindFileData;
        HANDLE hFind;
        TCHAR find_path[MAX_PATH];
        TCHAR path[MAX_PATH];
        TCHAR dtc[MAX_PATH];

        _tcscpy_s(find_path,sizeof(find_path)/sizeof(TCHAR),argv[1]);
        _tcscat_s(find_path,sizeof(find_path)/sizeof(TCHAR),TEXT("\\*.jpg"));
        hFind = FindFirstFile(find_path, &FindFileData);
        if (hFind == INVALID_HANDLE_VALUE) {
                _tprintf(TEXT("ファイルがみつかりませんでした。\n"));
        }else{
                
                _stprintf_s(dtc,sizeof(dtc)/sizeof(TCHAR),TEXT("%s\\tate"),argv[1]);
                _tmkdir(dtc);
                _stprintf_s(dtc,sizeof(dtc)/sizeof(TCHAR),TEXT("%s\\yoko"),argv[1]);
                _tmkdir(dtc);
                do{
                        int x,y;
                        _tcscpy_s(path,sizeof(path)/sizeof(TCHAR),argv[1]);
                        _tcscat_s(path,sizeof(path)/sizeof(TCHAR),TEXT("\\"));
                        _tcscat_s(path,sizeof(path)/sizeof(TCHAR),FindFileData.cFileName);
                        get_jpeg_size(path,&x,&y);
                        if(x<y)
                                _stprintf_s(dtc,sizeof(dtc)/sizeof(TCHAR),TEXT("%s\\tate\\%s"),argv[1],FindFileData.cFileName);
                        else
                                _stprintf_s(dtc,sizeof(dtc)/sizeof(TCHAR),TEXT("%s\\yoko\\%s"),argv[1],FindFileData.cFileName);

                        MoveFile(path,dtc);
#ifdef UNICODE
                        char sjis[MAX_PATH*2];
                        WCHAR utf[MAX_PATH*2];
                        _stprintf_s(utf,L"%s %i*%i",FindFileData.cFileName,x,y);
                        WideCharToMultiByte(932,0,utf,-1,sjis,sizeof(sjis),NULL,NULL);
                        puts(sjis);
#else
                        printf_s("%s %i*%i\n",path /*FindFileData.cFileName*/ ,x,y);
#endif

                }while((FindNextFile(hFind,&FindFileData)));
                FindClose(hFind);
        }
    GdiplusShutdown(gdiToken);
}