MSPAINT.EXE を改造してJPEGの品質を設定できるようにしてみたよ!
「ペイント」が終了へ?--「Windows 10」秋の大型アップデートで廃止・非推奨となる機能が公開 - CNET Japan
ペイントが終了するということで、XPのMSPAINTを Windows 2000で使う上で、JPEG品質をしていできないか改造してみることにしました
Windows の MSPAINT の画像の保存の仕組み
XP のやつは以前解析した結果Quality設定してないことが分かってる
MSPAINT.EXEのJPEGの保存は
SUB_L01030B3B: mov edi,edi push ebp mov ebp,esp push esi push [ebp+10h] mov esi,ecx push [ebp+0Ch] push [ebp+08h] push [esi+04h] call jmp_gdiplus_dll_DelayImport_GdipSaveImageToFile push eax mov ecx,esi call SUB_L010303AE pop esi pop ebp retn 000Ch |
こんな感じ
何やってるかというと
GdiSaveImageToFile(img, char * filename, CLDID[{557cf401-1a04-11d3-9a73-0000f81ef32e} ], NULL); |
これを…
EncoderParameters enc; enc.Count = 1; enc.Parameter[0].GUID = pvToCLSID(QUALITY_PARAMS); enc.Parameter[0].TypeAPI = 4; enc.Parameter[0].NumberOfValues = 1; enc.Parameter[0].Value = Quarity; GdiSaveImageToFile(img, char * filename, CLDID[{557cf401-1a04-11d3-9a73-0000f81ef32e} ], &enc); |
こうじゃ!
db CCh; '・ db CCh; '・ db CCh; '・ db CCh; '・ db CCh; '・ SUB_L01030B3B: mov edi,edi push ebp mov ebp,esp push esi push [ebp+10h] mov esi,ecx push [ebp+0Ch] push [ebp+08h] push [esi+04h] call jmp_gdiplus_dll_DelayImport_GdipSaveImageToFile push eax mov ecx,esi call SUB_L010303AE pop esi pop ebp retn 000Ch |
これを
db CCh; '・ db CCh; '・ SUB_L01030B36: push ebp mov ebp,esp push esi call PRECHECK_JPG push [ebp+10h] mov esi,ecx push [ebp+0Ch] push [ebp+08h] push [esi+04h] call jmp_gdiplus_dll_DelayImport_GdipSaveImageToFile push eax mov ecx,esi call SUB_L010303AE pop esi pop ebp retn 000Ch 01 00 00 00 |
こうやって…0%で保存してみると…?
おけ、うまくいった
0%にすると画像をモザイク変換できて面白いかも ・ω・
(MSPAINTに新しい利用方法が!)
ついでなんでレジストリで設定できるように改造してみよう
HKEY hKey; int tq=4,q=75; if(RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint\\Settings" ,0,KEY_READ,&hKey)==ERROR_SUCCESS){ if(RegQueryValueExA(hKey,"JpegQuality",0,0,(LPBYTE)&q,(LPDWORD)&tq)!=ERROR_SUCCESS){ tq=0; } if(tq!=4) q=75; RegCloseKey(hKey); } |
これを流し込んでみた・ω・
// GUIや設定ファイルで実装するのは改造する上でちょっとめんどくさいので割愛
// バイナリ直接いじるので、レジストリで実装すると簡単なんじゃよ
結果
JPEG Quality | ファイルサイズ |
0% | 20K |
16% | 35K |
32% | 49K |
64% | 73K |
75% | 88K |
XP標準 | 88K |
80% | 98K |
85% | 113K |
90% | 141K |
Win10 - Paint 3D | 149K |
91% | 152K |
92% | 160K |
94% | 185K |
95% | 204K |
Win7/10標準 | 209K |
96% | 223K |
97% | 249K |
98% | 289K |
99% | 339K |
100% | 509K |
オリジナル | 607K |
Windows 7のJPEG 品質高いね ・ω・(なんだこりゃ)
ダウンロード
mspaint.cab
使い方は
English version
mspainten.cab
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Paint\Settings
の JpegQuality に REG_DWORD 型で16進数で品質指定すること
同梱の setting.reg は 0x50 なので 80%
言わなくてもわかると思うけど、 Win2000の人はGDIPLUS.DLL が必要 ・ω・
Win10のJEPG品質も、同じでしょうか?
PNGと比べると、どうにも劣化具合が気になるので