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
b5 e4 5b 1d 4a fa 2d 45 9c dd 5d b3 51 05 e7 eb 01 00 00 00 04 00 00 00 24 fe 12 00
// 0103CC74
          DWORD Count = 01h
          ['{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}']
          DWORD NumberOfValues = 01h;
          DWORD Type = 04h;
          DWORD Data = &Quality;
//4B0A0D10
Quality  DD 64
PRECHECK_JPG:
          mov eax,[ebp+0Ch]
          cmp eax,DWORD PTR [4B0A0CF4]
          jz NOT_JPG
          mov [ebp+10h],offset 0103CC74
NOT_JPG:
          retn

こうやって…0%で保存してみると…?

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 が必要 ・ω・

おすすめ

1件の返信

  1. 通りすがり より:

    Win10のJEPG品質も、同じでしょうか?
    PNGと比べると、どうにも劣化具合が気になるので

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です