• R/O
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javaandroidc++objective-ccocoa誰得c#linuxgamebathyscaphephp翻訳qtpythonrubycwindowsomegattwitterguiframeworkbtronarduinovb.netdirectxtestゲームエンジンdom計画中(planning stage)previewer

docx, xlsx, pptx の中に張り付けられた PNG ( BMP ) を JPEG へ変換してファイルサイズを削減する。


Commit MetaInfo

Revision126 (tree)
Time2018-10-12 22:24:23
Authorhor931101jp

Log Message

(empty log message)

Change Summary

Incremental Difference

--- tags/OfficeImageReducer_0321-181012/ClassMyCommon.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/ClassMyCommon.cs (revision 126)
@@ -0,0 +1,157 @@
1+/***********************************************************//*!
2+ * @brief 共通部品
3+ * @details
4+ **************************************************************/
5+using System;
6+using System.Collections.Generic;
7+using System.Linq;
8+using System.Text;
9+using System.Threading.Tasks;
10+using System.Windows.Forms;
11+
12+namespace OfficeImageReducer
13+{
14+ /***********************************************************//*!
15+ * @brief 共通部品クラス
16+ * @details よく使う処理とかオブジェクトを定義
17+ **************************************************************/
18+ class ClassMyCommon
19+ {
20+ //! プログラムのタイトル
21+ public const string TITLE = "Office Image Reducer";
22+
23+ //! プログラムのバージョン
24+ public const string VERSION = "03.21-181012";
25+
26+ //! プログラム開始時の表示メッセージ
27+ public const string OPENING_MSG =
28+ "Programmed by S.Hori\r\n" +
29+ "\r\n" +
30+ "下記のWEBサイトから最新版を入手できます。\r\n" +
31+ "This software is hosted in the following site.\r\n" +
32+ "https://ja.osdn.net/users/hor931101jp/pf/01\r\n" +
33+ "下記のSVNリポジトリからソースコードをチェックアウトできます。\r\n" +
34+ "Anonymous access will allow anyone to download this source code\r\n" +
35+ "svn://svn.pf.osdn.jp/h/ho/hor931101jp/01/tags\r\n" +
36+ "\r\n" +
37+ "ここに docx xlsx pptx ファイルをドラックアンドドロップしてください。\r\n"+
38+ "Please drag and drop docx, xlsx, pptx files\r\n";
39+
40+ //! メインフォームのインスタンス
41+ public static Form frmMain;
42+
43+ //! ログのインスタンス
44+ public static ClassLog Log;
45+
46+ /***********************************************************//*!
47+ * @brief 待機処理
48+ * @param[in] WaitTime 待ち時間[ms]
49+ * @details Application.DoEventsとThread.Sleepをしながら待機
50+ **************************************************************/
51+ static public void WaitTickCount(Int32 WaitTime)
52+ {
53+ Int64 StartTickCount = Environment.TickCount;
54+ Int64 NowTickCount;
55+ do
56+ {
57+ Application.DoEvents();
58+ System.Threading.Thread.Sleep(1);
59+ NowTickCount = Environment.TickCount;
60+ }
61+ while ((NowTickCount - StartTickCount) < WaitTime);
62+ }
63+
64+ [System.Runtime.InteropServices.DllImport("user32.dll")]
65+ static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
66+ [System.Runtime.InteropServices.DllImport("user32.dll")]
67+ static extern bool DrawMenuBar(IntPtr hWnd);
68+ [System.Runtime.InteropServices.DllImport("user32.dll")]
69+ static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);
70+
71+ /***********************************************************//*!
72+ * @brief フォームの右上ボタンと左上メニューのカスタマイズ
73+ * @param[in] f 対象とするフォーム
74+ * @details フォーム右上ボタンのうち[x]ボタンを無効化する。
75+ * 左上メニューの[閉じる]を消去
76+ **************************************************************/
77+ public static void FormControlBoxCustomize(Form f)
78+ {
79+ //const uint SC_SIZE = 0xF000; //システムメニューの「サイズ変更」
80+ //const uint SC_MOVE = 0xF010; //システムメニューの「移動」
81+ //const uint SC_MINIMIZE = 0xF020; //システムメニューの「最小化」
82+ //const uint SC_MAXIMIZE = 0xF030; //システムメニューの「最大化」
83+ const uint SC_CLOSE = 0xF060; //システムメニューの「閉じる」
84+ //const uint SC_RESTORE = 0xF120; //システムメニューの「元のサイズに戻す」
85+ const uint MF_BYCOMMAND = 0x0; //メニュー項目指定
86+ const uint MF_BYPOSITION = 0x400; //ポジション指定
87+ //const uint MF_ENABLED = 0x0; //有効化
88+ //const uint MF_GRAYED = 0x1; //無効化
89+ //const uint MF_DISABLED = 0x2; //半無効化(見かけ上有効)
90+ bool DUMMY;
91+
92+ //「区切り線」の削除
93+ DUMMY = RemoveMenu(GetSystemMenu(f.Handle, false), 5, MF_BYPOSITION);
94+ //「閉じる」の削除 + xボタンの無効化
95+ DUMMY = RemoveMenu(GetSystemMenu(f.Handle, false), SC_CLOSE, MF_BYCOMMAND);
96+ //描画(変更を反映)
97+ DUMMY = DrawMenuBar(f.Handle);
98+ }
99+
100+ /***********************************************************//*!
101+ * @brief 自身の exe ファイルの存在するパスを返す
102+ * @return 戻り値(パス)は最後に '\' 付き
103+ **************************************************************/
104+ public static string AppPath()
105+ {
106+ return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\";
107+ }
108+
109+ /***********************************************************//*!
110+ * @brief 文字列を渡して先頭から指定した長さだけの文字列を切り出して返す
111+ * @param[in] str 文字列
112+ * @param[in] len 長さ
113+ * @return 切り出した文字列
114+ * @details BASICに昔からある Left$ 関数
115+ **************************************************************/
116+ public static string Left(string str, int len)
117+ {
118+ if (len < 0)
119+ {
120+ throw new ArgumentException("引数'len'は0以上でなければなりません。");
121+ }
122+ if (str == null)
123+ {
124+ return "";
125+ }
126+ if (str.Length <= len)
127+ {
128+ return str;
129+ }
130+ return str.Substring(0, len);
131+ }
132+
133+ /***********************************************************//*!
134+ * @brief 文字列の末尾から指定した長さの文字列を取得する
135+ * @param[in] str 文字列
136+ * @param[in] len 長さ
137+ * @return 切り出した文字列
138+ * @details BASICに昔からある Right$ 関数
139+ **************************************************************/
140+ public static string Right(string str, int len)
141+ {
142+ if (len < 0)
143+ {
144+ throw new ArgumentException("引数'len'は0以上でなければなりません。");
145+ }
146+ if (str == null)
147+ {
148+ return "";
149+ }
150+ if (str.Length <= len)
151+ {
152+ return str;
153+ }
154+ return str.Substring(str.Length - len, len);
155+ }
156+ }
157+}
--- tags/OfficeImageReducer_0321-181012/FormMain.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/FormMain.cs (revision 126)
@@ -0,0 +1,680 @@
1+/***********************************************************//*!
2+ * @brief メインフォーム
3+ * @details メインフォームに関する処理
4+ **************************************************************/
5+using System;
6+using System.IO;
7+using System.IO.Compression;
8+using System.Collections.Generic;
9+using System.ComponentModel;
10+using System.Data;
11+using System.Drawing;
12+using System.Linq;
13+using System.Text;
14+using System.Threading.Tasks;
15+using System.Windows.Forms;
16+using static OfficeImageReducer.ClassMyCommon;
17+
18+namespace OfficeImageReducer
19+{
20+ /***********************************************************//*!
21+ * @brief メインウインドウフォーム
22+ * @details
23+ **************************************************************/
24+ public partial class FormMain : Form
25+ {
26+ //! ZIP解凍用の一時ファイルネーム
27+ string ZipFileName;
28+ //! ZIP解凍用の一時解凍先フォルダネーム
29+ string ExtractPath;
30+
31+ /***********************************************************//*!
32+ * @brief コンストラクタ
33+ **************************************************************/
34+ public FormMain()
35+ {
36+ InitializeComponent();
37+ }
38+
39+ /***********************************************************//*!
40+ * @brief フォームロードイベント
41+ * @param[in] sender イベントを発生させたオブジェクトへの参照
42+ * @param[in] e 処理されるイベントに応じた特定のオブジェクト
43+ * @details
44+ **************************************************************/
45+ private void FormMain_Load(object sender, EventArgs e)
46+ {
47+#if false
48+ // 多重起動チェック
49+ //Process.GetProcessesByName メソッド
50+ //指定したプロセス名を共有するリモートコンピュータ上の
51+ //すべてのプロセスリソースに関連付けます。
52+ string pn = System.Diagnostics.Process.GetCurrentProcess().ProcessName; //Process.ProcessName プロパティ(プロセスの名前を取得します)
53+ if (System.Diagnostics.Process.GetProcessesByName(pn).GetUpperBound(0) > 0)
54+ {
55+ //! 多重起動しているならばエラーメッセージ表示して終了
56+ MessageBox.Show("すでに起動しています。", TITLE + " エラーメッセージ",
57+ MessageBoxButtons.OK,
58+ MessageBoxIcon.Error);
59+ Environment.Exit(0);
60+ }
61+#endif
62+ frmMain = this;
63+ //! フォームの右上ボタンと左上の右クリックメニューをカスタマイズ
64+ FormControlBoxCustomize(this);
65+ Log = new ClassLog(textBox1);
66+ this.Text = TITLE + " " + VERSION;
67+ //! オープニングメッセージを表示
68+ button1.PerformClick();
69+ // 表示開始後0.5秒は最前面にもってくる
70+ Show();
71+ TopMost = true;
72+ WaitTickCount(500);
73+ TopMost = false;
74+ }
75+
76+ /***********************************************************//*!
77+ * @brief [About]ボタンクリックイベント
78+ * @param[in] sender イベントを発生させたオブジェクトへの参照
79+ * @param[in] e 処理されるイベントに応じた特定のオブジェクト
80+ * @details プログラムタイトル バージョン オープニングメッセージを表示
81+ **************************************************************/
82+ private void button1_Click(object sender, EventArgs e)
83+ {
84+ Log.Put(
85+ "----------------------------------------------------------------\r\n"
86+ + TITLE + " " + VERSION + "\r\n"
87+ + OPENING_MSG
88+ + "\r\n"
89+ + "----------------------------------------------------------------\r\n"
90+ );
91+ }
92+
93+ /***********************************************************//*!
94+ * @brief [Clear Log]ボタンクリックイベント
95+ * @param[in] sender イベントを発生させたオブジェクトへの参照
96+ * @param[in] e 処理されるイベントに応じた特定のオブジェクト
97+ * @details
98+ **************************************************************/
99+ private void button2_Click(object sender, EventArgs e)
100+ {
101+ Log.Clear();
102+ }
103+
104+ /***********************************************************//*!
105+ * @brief [Quit]ボタンクリックイベント
106+ * @param[in] sender イベントを発生させたオブジェクトへの参照
107+ * @param[in] e 処理されるイベントに応じた特定のオブジェクト
108+ * @details
109+ **************************************************************/
110+ private void button3_Click(object sender, EventArgs e)
111+ {
112+ Close();
113+ }
114+
115+ /***********************************************************//*!
116+ * @brief ログテキストエリアのドラッグエンターイベント
117+ * @param[in] sender イベントを発生させたオブジェクトへの参照
118+ * @param[in] e 処理されるイベントに応じた特定のオブジェクト
119+ * @details ドラッグエンターされたものがファイルの場合のみ、ドラッグを受け付ける
120+ **************************************************************/
121+ private void textBox1_DragEnter(object sender, DragEventArgs e)
122+ {
123+ if (e.Data.GetDataPresent(DataFormats.FileDrop) == true)
124+ {
125+ e.Effect = DragDropEffects.Copy;
126+ }
127+ else
128+ {
129+ e.Effect = DragDropEffects.None;
130+ }
131+ }
132+
133+ /***********************************************************//*!
134+ * @brief ドロップされた時の処理
135+ * @param[in] sender イベントを発生させたオブジェクトへの参照
136+ * @param[in] e 処理されるイベントに応じた特定のオブジェクト
137+ * @details
138+ **************************************************************/
139+ private void textBox1_DragDrop(object sender, DragEventArgs e)
140+ {
141+ Color textBox1BackColor = textBox1.BackColor;
142+
143+ //! 作業中はさらにドラッグ&ドロップできないようにする
144+ textBox1.Enabled = false;
145+ textBox1.BackColor = this.BackColor;
146+
147+ //! ドラッグされたファイル・フォルダのパスを格納
148+ string[] strFileNames = (string[])e.Data.GetData(DataFormats.FileDrop, false);
149+
150+ //! ひとつずつoffice2007ファイルをメイン処理に渡す。
151+ foreach (string strFileName in strFileNames)
152+ {
153+ Main_Process(strFileName);
154+ WaitTickCount(100);
155+ }
156+
157+ textBox1.Enabled = true;
158+ textBox1.BackColor = textBox1BackColor;
159+ }
160+
161+
162+ /***********************************************************//*!
163+ * @brief フォルダを再帰的に下りて全ファイルの属性を削除
164+ * @param[in] dirInfo フォルダ操作用インスタンス
165+ **************************************************************/
166+ private void RemoveReadonlyAttribute(DirectoryInfo dirInfo)
167+ {
168+ try
169+ {
170+ //基のフォルダの属性を変更
171+ if ((dirInfo.Attributes & FileAttributes.ReadOnly) ==
172+ FileAttributes.ReadOnly)
173+ dirInfo.Attributes = FileAttributes.Normal;
174+ //フォルダ内のすべてのファイルの属性を変更
175+ foreach (FileInfo fi in dirInfo.GetFiles())
176+ if ((fi.Attributes & FileAttributes.ReadOnly) ==
177+ FileAttributes.ReadOnly)
178+ fi.Attributes = FileAttributes.Normal;
179+ //サブフォルダの属性を回帰的に変更
180+ foreach (DirectoryInfo di in dirInfo.GetDirectories())
181+ RemoveReadonlyAttribute(di);
182+
183+ }
184+ catch (Exception ex)
185+ {
186+ Log.Put("Error:RemoveReadonlyAttribute():ex.Message\r\n" + ex.Message);
187+ Log.Put("Error:RemoveReadonlyAttribute():ex.StacTrace\r\n" + ex.StackTrace);
188+ }
189+ }
190+
191+ /***********************************************************//*!
192+ * @brief 作業終了後のクリーンアップ処理
193+ * @details 作業用フォルダとZIPが残っていれば削除
194+ **************************************************************/
195+ private void CleanUp()
196+ {
197+ if (ExtractPath != "")
198+ {
199+ try
200+ {
201+ if (Directory.Exists(ExtractPath))
202+ {
203+
204+ //DirectoryInfoオブジェクトの作成
205+ DirectoryInfo di = new DirectoryInfo(ExtractPath);
206+
207+ //フォルダ以下のすべてのファイル、フォルダの属性を削除
208+ RemoveReadonlyAttribute(di);
209+
210+ //フォルダを根こそぎ削除
211+ //di.Delete(true);
212+ Directory.Delete(ExtractPath, true);
213+ }
214+ }
215+ catch (Exception ex)
216+ {
217+ Log.Put("Error:CleanUp():ex.Message\r\n" + ex.Message);
218+ Log.Put("Error:CleanUp():ex.StacTrace\r\n" + ex.StackTrace);
219+ }
220+ }
221+
222+ if (ZipFileName != null)
223+ {
224+ File.Delete(ZipFileName);
225+ }
226+ }
227+
228+ /***********************************************************//*!
229+ * @brief PNGファイルの中に透明色(tRNSチャンク)透過色(αチャンネル)があるか判定する
230+ * @param[in] PngFileName フルパス付きPNGファイルネーム
231+ * @return 0:透明色透過色なし 1:tRNSチャンク透明色あり 2:αチャンネル透過色あり
232+ * @details
233+ **************************************************************/
234+ private int PngTransCheck(string PngFileName)
235+ {
236+ //Log.Put("tRNS Chunk Check:" + PngFileName);
237+ string[] StrArray;
238+ StrArray = PngFileName.Split('\\');
239+ string SplitPngFileName = StrArray[StrArray.Length - 1];
240+
241+ int fileSize = 0; //ファイルのサイズ
242+ int bufPos = 0; //データ格納用配列内の追加位置
243+ Byte[] buf = null; //データ格納用配列を仮確保
244+ //Array.Resize(ref buf, 1);
245+
246+ using (FileStream fs = new FileStream(PngFileName, FileMode.Open, FileAccess.Read))
247+ {
248+ fileSize = (int)fs.Length; //ファイルのサイズ
249+ Array.Resize(ref buf, fileSize); //データ格納用配列サイズ決定
250+
251+ int readSize; //Readメソッドで読み込んだバイト数
252+ int remain = fileSize; //読み込むべき残りのバイト数
253+
254+ while (remain > 0)
255+ {
256+ //1024Bytesずつ読み込む
257+ readSize = fs.Read(buf, bufPos, Math.Min(1024, remain));
258+ bufPos += readSize;
259+ remain -= readSize;
260+ }
261+ }
262+
263+ //buf[] をチェック
264+ bufPos = 8; //8byte目から確認
265+ int ChunkSize;
266+ while (bufPos < fileSize)
267+ {
268+ ChunkSize = (buf[bufPos] << 24) + (buf[bufPos + 1] << 16) + (buf[bufPos + 2] << 8) + buf[bufPos + 3];
269+ //Log.Put("chunksize=" + ChunkSize.ToString);
270+ bufPos += 4;
271+ if (buf[bufPos] == 't' && buf[bufPos + 1] == 'R'
272+ && buf[bufPos + 2] == 'N' && buf[bufPos + 3] == 'S')
273+ {
274+ Log.Put("tRNSチャンクを検出しました。透明色があります。");
275+ Log.Put("tRNS chunk was detected. There is a transparent color.");
276+ //Log.Put(SplitPngFileName + " has tRNS chunk.");
277+ return 1;
278+ }
279+ bufPos += 4;
280+ bufPos += ChunkSize;
281+ bufPos += 4;
282+ }
283+
284+ // PNG(BMP)ファイルオープン
285+ using (Bitmap bmp = new Bitmap(PngFileName))
286+ {
287+ if (bmp.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb
288+ || bmp.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
289+ {
290+
291+ //アルファチャンネルのあるPNGフォーマット
292+
293+ System.Drawing.Imaging.BitmapData bmpdat;
294+
295+ bmpdat = bmp.LockBits(new Rectangle(Point.Empty, bmp.Size),
296+ System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
297+
298+ Array.Resize(ref buf, bmp.Width * bmp.Height * 4); //データ格納用配列サイズ決定
299+ System.Runtime.InteropServices.Marshal.Copy(bmpdat.Scan0, buf, 0, buf.Length);
300+ int PixelX;
301+ int PixelY;
302+
303+ for (PixelY = 0; PixelY < bmp.Height; PixelY++)
304+ {
305+ Application.DoEvents();
306+ for (PixelX = 0; PixelX < bmp.Width; PixelX++)
307+ {
308+ Byte Alpha; //αチャンネル 0:透明 ~ 255:完全不透明
309+ Byte Red;
310+ Byte Green;
311+ Byte Blue;
312+
313+ Alpha = buf[(PixelY * bmp.Width + PixelX) * 4 + 3];
314+ Red = buf[(PixelY * bmp.Width + PixelX) * 4 + 2];
315+ Green = buf[(PixelY * bmp.Width + PixelX) * 4 + 1];
316+ Blue = buf[(PixelY * bmp.Width + PixelX) * 4 + 0];
317+ if (Alpha < 255)
318+ {
319+ Log.Put("αチャンネルを検出しました。透過色があります。");
320+ Log.Put("Alpha channel was detected. There is a transparent color.");
321+ //Log.Put(SplitPngFileName + " has alpha chunnel.");
322+ //Log.Put("X,Y ARGB = " + PixelX + "," + PixelY + "," + Alpha + "," + Red + "," + Green + "," + Blue);
323+ //!αチャンネル255未満を検出したら1を返す (0:透明 ~ 255:完全不透明)
324+ return 2;
325+ }
326+ }
327+ }
328+ }
329+ }
330+
331+ return 0;
332+ }
333+
334+ /***********************************************************//*!
335+ * @brief メイン処理
336+ * @param[in] OrgFileName Office2007形式のフルパス付ファイルネーム
337+ * @details
338+ **************************************************************/
339+ private void Main_Process(string OrgFileName)
340+ {
341+ //! ファイルの存在確認を行い、なければ終了。引数がフォルダ名だった場合も終了
342+ if (File.Exists(OrgFileName) == false)
343+ {
344+ return;
345+ }
346+
347+ // ログにパスを表示
348+ Log.Put("====================");
349+ Log.Put(OrgFileName);
350+ Application.DoEvents();
351+
352+ // PNGからJPGへ変換されたファイル数
353+ UInt32 JPGcount = 0;
354+ // ZIP解凍用の一時ファイルネーム
355+ ZipFileName = Path.GetDirectoryName(OrgFileName) + "\\~OfficeImgRedTemp.zip";
356+ // ZIP解凍用の一時解凍先フォルダネーム
357+ ExtractPath = Path.GetDirectoryName(OrgFileName) + "\\~OfficeImgRedExtract";
358+ // Office2007系ファイルの中にあるコンテンツの管理ファイル
359+ string CurrentTypesFileName = ExtractPath + "\\[Content_Types].xml";
360+
361+ CleanUp();
362+
363+ //! office2007ファイルでなければ終了
364+ string FileExtension = OrgFileName.Substring(OrgFileName.Length - 5).ToLower();
365+ if ((FileExtension != ".xlsx") &&
366+ (FileExtension != ".xlsm") &&
367+ (FileExtension != ".pptx") &&
368+ (FileExtension != ".pptm") &&
369+ (FileExtension != ".docx") &&
370+ (FileExtension != ".docm"))
371+ {
372+ Log.Put("office2007 ファイル以外には対応していません。");
373+ Log.Put("It is not a OFFICE2007 file.");
374+ return;
375+ }
376+
377+ // ファイルの拡張子をピリオドなしで格納
378+ FileExtension = OrgFileName.Substring(OrgFileName.Length - 4).ToLower();
379+
380+ Log.Put("analyzing...");
381+
382+ try
383+ {
384+ // 前の処理の残骸残っていればクリーンナップ
385+ CleanUp();
386+
387+ //! office2007ファイルをZIPファイルへリネームコピー
388+ File.Copy(OrgFileName, ZipFileName);
389+ // ZIP解凍作業用フォルダ作成
390+ try
391+ {
392+ Directory.CreateDirectory(ExtractPath);
393+ }
394+ catch (Exception ex)
395+ {
396+ Log.Put("作業用フォルダの作成に失敗しました。:" + ex.Message );
397+ }
398+
399+ // ZIP解凍
400+ // リューション エクスプローラー内、[参照設定] から
401+ // ZipFile クラスを含む DLL(System.IO.Compression.FileSystem.dll) を手動で追加すること
402+ ZipFile.ExtractToDirectory(ZipFileName, ExtractPath, Encoding.GetEncoding("shift_jis"));
403+
404+ // 解凍したZIPの中に [Content_Types].xml があるかどうか確認する。
405+ if (!(File.Exists(CurrentTypesFileName)))
406+ {
407+ // 存在しないならクリーンアップして終了。
408+ Log.Put("対象ファイルの解析ができません。");
409+ CleanUp();
410+ return;
411+ }
412+
413+ // PNGを格納しているパス
414+ string MediaPath;
415+ if (Directory.Exists(ExtractPath + "\\xl\\media\\"))
416+ {
417+ MediaPath = ExtractPath + "\\xl\\media";
418+ }
419+ else if (Directory.Exists(ExtractPath + "\\ppt\\media\\"))
420+ {
421+ MediaPath = ExtractPath + "\\ppt\\media";
422+ }
423+ else if (Directory.Exists(ExtractPath + "\\word\\media\\"))
424+ {
425+ MediaPath = ExtractPath + "\\word\\media";
426+ }
427+ else
428+ {
429+ Log.Put("ファイルの中にメディア格納フォルダがありません。");
430+ Log.Put("There is no media folder in the file.");
431+ CleanUp();
432+ return;
433+ }
434+
435+ // フルパス付PNGファイル名
436+ string[] MediaFileNames = Directory.GetFiles(MediaPath, "*.png");
437+ if (MediaFileNames.Length == 0)
438+ {
439+ Log.Put("ファイルの中にPNG(BMP)ファイルがありません。");
440+ Log.Put("There is no PNG(BMP) in the file.");
441+ CleanUp();
442+ return;
443+ }
444+#if false
445+ foreach (string MediaFileName in MediaFileNames)
446+ {
447+ Log.Put(MediaFileName);
448+ }
449+#endif
450+ // *.rels リレーションファイルすべてをリストアップ
451+ string[] RelsFileNames = Directory.GetFiles(ExtractPath, "*.rels", SearchOption.AllDirectories);
452+#if false
453+ foreach (string RelsFileName in RelsFileNames)
454+ {
455+ Log.Put(RelsFileName);
456+ }
457+#endif
458+ // 作業用文字列の配列
459+ string[] StrArray;
460+ // ファイル読み出しデータ格納用文字列
461+ string Result = String.Empty;
462+
463+ // 取得したPNGファイルの処理をする
464+ foreach (string MediaFileName in MediaFileNames)
465+ {
466+ StrArray = MediaFileName.Split('\\');
467+ // パスなしPNGファイル名を格納
468+ string SplitMediaFileName = StrArray[StrArray.Length - 1];
469+ Log.Put("---");
470+ Log.Put(SplitMediaFileName);
471+
472+ // PNGファイルのサイズを取得
473+ long Medialen = new FileInfo(MediaFileName).Length;
474+
475+ // 作業用JPGファイル
476+ string TmpJpgFileName = MediaPath + "~OfficeImgRedtemp.jpg";
477+
478+ //PNGファイルを開く
479+ try
480+ {
481+ //前回の作業ファイルが残っていれば削除する
482+ File.Delete(TmpJpgFileName);
483+
484+ //PNGに透過透明がある場合はJPG化せず、次のPNGファイルを処理する
485+ if (0 != PngTransCheck(MediaFileName))
486+ {
487+ //Log.Put("透過色");
488+ continue;
489+ }
490+ // PNG(BMP)ファイルオープン
491+ using (Bitmap bmp = new Bitmap(MediaFileName))
492+ {
493+ //JPEG形式で保存する
494+ bmp.Save(TmpJpgFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
495+ }
496+ }
497+ catch
498+ {
499+ // 不正なBMP/PNGであればオープン時に例外が発生する。
500+ File.Delete(TmpJpgFileName);
501+ // 次のPNGファイルの処理へ
502+ continue;
503+ }
504+
505+ // 生成されたJPGファイルサイズを格納
506+ long Jpglen = new FileInfo(TmpJpgFileName).Length;
507+
508+ // 生成されたJPGファイルがもとのPNGより20%以上縮小された場合はJPGを採用する
509+ if (Jpglen > (Medialen * 0.8))
510+ {
511+ // 生成されたJPGファイルがもとのPNGより20%以上縮小されなかった場合
512+ Log.Put("JPG化してもサイズが小さくなりませんでした。");
513+ Log.Put("The file size was not become smaller.");
514+ File.Delete(TmpJpgFileName);
515+ }
516+ else
517+ {
518+ // 生成されたJPGファイルがもとのPNGより20%以上縮小された場合
519+ // フルパス付JPGファイル名
520+ string NewMediaFileName = "";
521+ int j;
522+ for (j = 0; ; j++)
523+ {
524+ // フルパス付JPGファイル名候補を格納
525+ if (j == 0)
526+ {
527+ NewMediaFileName = MediaFileName.Substring(0, MediaFileName.Length - 4) + ".jpeg";
528+ }
529+ else
530+ {
531+ NewMediaFileName = MediaFileName.Substring(0, MediaFileName.Length - 4) + "(" + (j - 1).ToString() + ").jpeg";
532+ }
533+
534+ // 一時ファイネームのJPGを正式なファイル名に変更する。
535+ if (File.Exists(NewMediaFileName) == true)
536+ {
537+ // JPGファイルネームがかぶった場合は9999回までリトライするが、それでもだめだった場合はあきらめる
538+ if (j > 9999)
539+ {
540+ break;
541+ }
542+
543+ // JPGファイルネームがかぶった場合はリトライ
544+ continue;
545+ }
546+ else
547+ {
548+ // リネームする
549+ File.Move(TmpJpgFileName, NewMediaFileName);
550+ // もとからあったPNGファイルを削除
551+ File.Delete(MediaFileName);
552+ break; // forループ脱出
553+
554+ }
555+ }
556+ if (j > 9999)
557+ {
558+ // 9999回までリトライしてだめならあきらめて次のPNGファイルを処理する。
559+ File.Delete(TmpJpgFileName);
560+ continue;
561+ }
562+
563+ StrArray = NewMediaFileName.Split('\\');
564+ // フルパスなしJPGファイル名を格納
565+ string SplitNewMediaFileName = StrArray[StrArray.Length - 1];
566+ Log.Put(SplitMediaFileName + " was converted to " + SplitNewMediaFileName);
567+ // JPGに変換したPNGファイルの数をカウント
568+ JPGcount = JPGcount + 1;
569+
570+ Application.DoEvents(); //ログ表示更新の為
571+
572+ // リレーションファイル内のPNGファイル名をJPGファイル名にする
573+ foreach (string RelsFileName in RelsFileNames)
574+ {
575+ // リレーションファイルの中身を読みだす
576+ Result = String.Empty;
577+ using (StreamReader Reader = new StreamReader(RelsFileName, Encoding.GetEncoding("shift-jis")))
578+ {
579+ Result = Reader.ReadToEnd();
580+ //Log.Put(Result);
581+ }
582+
583+ // リレーションファイルの中にPNGファイルネームがある場合はJPGファイルネームに置換して上書き
584+ if (Result.IndexOf(SplitMediaFileName) >= 0)
585+ {
586+ //Log.Put(Result);
587+ Result = Result.Replace(SplitMediaFileName, SplitNewMediaFileName);
588+ //上書モードでリレーションファイルを開く
589+ using (StreamWriter Writer = new StreamWriter(RelsFileName, false, Encoding.GetEncoding("shift-jis")))
590+ {
591+ // リレーションファイル上書き
592+ Writer.Write(Result);
593+ //Log.Put(Result);
594+ }
595+ }
596+ }
597+ }
598+ }
599+
600+ if (JPGcount == 0)
601+ {
602+ Log.Put("JPG化すべきデータはありませんでした。");
603+ Log.Put("There is no files to be converted to JPG.");
604+ return;
605+ }
606+
607+ // ExtractPath + "\[Content_Types].xml の中に拡張子jpegを追記する
608+ Result = String.Empty;
609+ using (StreamReader Reader = new StreamReader(CurrentTypesFileName, Encoding.GetEncoding("shift-jis")))
610+ {
611+ Result = Reader.ReadToEnd();
612+ }
613+ //追加する文字列 <Default Extension="jpeg" ContentType="application/jpeg"/>
614+ if (Result.ToLower().IndexOf("default extension=\"jpeg\"") >= 0)
615+ {
616+ //すでに拡張子jpegが登録されているので変更不要
617+ }
618+ else
619+ {
620+ Result = Result.Replace(
621+ "<Default Extension=\"xml\" ContentType=\"application/xml\"/>",
622+ "<Default Extension=\"xml\" ContentType=\"application/xml\"/><Default Extension=\"jpeg\" ContentType=\"application/jpeg\"/>");
623+ //上書モードでShift-JISファイルを開く
624+ using (StreamWriter Writer = new System.IO.StreamWriter(CurrentTypesFileName, false, Encoding.GetEncoding("shift-jis")))
625+ {
626+ Writer.Write(Result);
627+ //Log.Put(Result);
628+ }
629+ }
630+
631+ // 再圧縮する前に、JPEG化まえのZIP書庫を削除する
632+ File.Delete(ZipFileName);
633+
634+ // ZIP書庫を作成する サイズ優先
635+ //ZipFile.CreateFromDirectory(ExtractPath, ZipFileName, CompressionLevel.Optimal, false, Encoding.GetEncoding("shift_jis"));
636+ // ZIP書庫を作成する 処理速度優先
637+ ZipFile.CreateFromDirectory(ExtractPath, ZipFileName, CompressionLevel.Fastest, false, Encoding.GetEncoding("shift_jis"));
638+
639+ // 圧縮前の office2007 ファイルをリネームする 例 aaaa.xlsx -> aaaa(0).xlsx
640+ for (int i = 0; ; i++)
641+ {
642+ // リネームするファイル名
643+ string NewOrgFileName
644+ = OrgFileName.Substring(0, OrgFileName.Length - 5) + "(" + i.ToString() + ")" + OrgFileName.Substring(OrgFileName.Length - 5);
645+
646+ if (i >= 10000)
647+ {
648+ File.Delete(NewOrgFileName);
649+ }
650+
651+ if (File.Exists(NewOrgFileName) == true)
652+ {
653+ // ファイルの存在確認を行い、すでに存在すれば、リトライ
654+ continue;
655+ }
656+ else
657+ {
658+ // リネーム処理して終了
659+ File.Move(OrgFileName, NewOrgFileName);
660+ break;
661+ }
662+ }
663+
664+ // 一時ZIPファイルネームをもとのoffice2007ファイルネームにする。
665+ File.Move(ZipFileName, OrgFileName);
666+ Log.Put("作業終了しました。");
667+ Log.Put("It is finished.");
668+ }
669+ catch (Exception ex)
670+ {
671+ Log.Put("Error:Main_Process():ex.Message\r\n" + ex.Message);
672+ Log.Put("Error:CleanUp():ex.StacTrace\r\n" + ex.StackTrace);
673+ }
674+ finally
675+ {
676+ CleanUp();
677+ }
678+ }
679+ }
680+}
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
--- tags/OfficeImageReducer_0321-181012/Installer/EXEpress Project.ini (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/Installer/EXEpress Project.ini (revision 126)
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
--- tags/OfficeImageReducer_0321-181012/ClassLog.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/ClassLog.cs (revision 126)
@@ -0,0 +1,175 @@
1+/***********************************************************//*!
2+ * @brief ログ処理
3+ * @details
4+ **************************************************************/
5+using System;
6+using System.Collections.Generic;
7+using System.Linq;
8+using System.Text;
9+using System.Threading.Tasks;
10+using System.Windows.Forms;
11+using System.IO;
12+
13+namespace OfficeImageReducer
14+{
15+ /***********************************************************//*!
16+ * @brief ログクラス
17+ * @details ログを管理する
18+ **************************************************************/
19+ class ClassLog
20+ {
21+ //! ログを保存するフルパス付ファイル名
22+ private string LogFileName;
23+
24+ //! ファイル保存用のログ文字列を確保する
25+ private string _ShadowBuf;
26+
27+ //! ログ表示用テキストボックス
28+ private TextBox _LogTextBox;
29+
30+ /***********************************************************//*!
31+ * @brief コンストラクタ
32+ * @param[in] LogTextBox ログ表示用のテキストボックス
33+ * @details
34+ **************************************************************/
35+ public ClassLog(TextBox LogTextBox)
36+ {
37+ _LogTextBox = LogTextBox;
38+ _LogTextBox.Text = "";
39+ _ShadowBuf = "";
40+ LogFileName = ClassMyCommon.AppPath() + ClassMyCommon.TITLE
41+ + "Log" + System.DateTime.Now.ToString("yyMMdd") + ".txt";
42+ }
43+
44+ /***********************************************************//*!
45+ * @brief 他のスレッドからコールする為のデリゲート
46+ **************************************************************/
47+ delegate void Add_Callback(string stradd);
48+
49+ /***********************************************************//*!
50+ * @brief ログに文字列を追加する
51+ * @param[in] stradd ログへ追加する文字列
52+ * @details ログの表示は更新スクロールされない
53+ **************************************************************/
54+ public void Add(string stradd)
55+ {
56+ if (stradd == "")
57+ {
58+ //! 文字列がカラなら即終了
59+ return;
60+ }
61+
62+ if (_LogTextBox.InvokeRequired)
63+ {
64+ // 別スレッドから呼び出された場合デリゲートからコールバックさせる
65+ _LogTextBox.Invoke(new Add_Callback(Add), stradd);
66+ return;
67+ }
68+
69+ //! 表示されている古いログは削除する
70+ DeleteOld();
71+
72+ // タイムスタンプ文字列を生成
73+ string TimeStamp = System.DateTime.Now.ToString("MM/dd HH:mm:ss : ");
74+ // ログ追加文字列の先頭にタイムスタンプを追加
75+ stradd = TimeStamp + stradd;
76+
77+ // ログ追加文字列の最後尾に "\r\n" があった場合は、いったん削除する
78+ if (stradd.Substring(stradd.Length - "\r\n".Length, "\r\n".Length) == "\r\n")
79+ {
80+ stradd = stradd.Substring(0, stradd.Length - "\r\n".Length);
81+ }
82+
83+ // ログ追加文字列の中に "\r\n" があった場合は、"\r\n+タイムスタンプ" に置換する
84+ stradd = stradd.Replace("\r\n", "\r\n" + TimeStamp);
85+
86+ // ログ追加文字列の最後尾に "\r\n" を追加
87+ stradd += "\r\n";
88+
89+ // 加工したログ追加文字列を保存用文字列とテキストボックスへ追加
90+ _LogTextBox.Text += stradd;
91+ _ShadowBuf += stradd;
92+
93+ }
94+
95+ /***********************************************************//*!
96+ * @brief 他のスレッドからコールする為のデリゲート
97+ **************************************************************/
98+ delegate void Put_Callback(string stradd);
99+
100+ /***********************************************************//*!
101+ * @brief ログに文字列を追加しログ表示を最下行へ強制スクロールする
102+ * @param[in] stradd ログへ追加する文字列
103+ * @details
104+ **************************************************************/
105+ public void Put(string stradd)
106+ {
107+ if (_LogTextBox.InvokeRequired)
108+ {
109+ // 別スレッドから呼び出された場合デリゲートからコールバックさせる
110+ _LogTextBox.Invoke(new Put_Callback(Put), stradd);
111+ return;
112+ }
113+
114+ // ログ追加
115+ Add(stradd);
116+
117+ // ログ表示を最下行へスクロールする。
118+ _LogTextBox.SelectionStart = _LogTextBox.Text.Length;
119+ _LogTextBox.ScrollToCaret();
120+
121+ }
122+
123+ /***********************************************************//*!
124+ * @brief ログにデバッグ用文字列を追加
125+ * @param[in] stradd ログへ追加する文字列
126+ * @details
127+ **************************************************************/
128+ public void DebugPut(string stradd)
129+ {
130+#if false
131+ Put(stradd);
132+#endif
133+ }
134+
135+ /***********************************************************//*!
136+ * @brief ログをファイルに保存
137+ * @details
138+ **************************************************************/
139+ public void Save()
140+ {
141+#if false
142+ using (StreamWriter sw = new StreamWriter(
143+ LogFileName,
144+ true,
145+ System.Text.Encoding.GetEncoding("shift-jis")))
146+ {
147+ // ファイルへの書き込み
148+ sw.Write(_ShadowBuf);
149+ }
150+#endif
151+ }
152+
153+ /***********************************************************//*!
154+ * @brief ログ表示部から古いログを削除
155+ * @details 削除されるのは表示部のみ。保存用文字列からは削除しない。
156+ **************************************************************/
157+ private void DeleteOld()
158+ {
159+ //! ログ表示量が MaxLength-1024 より大きくなったら破棄する
160+ if (_LogTextBox.Text.Length > (_LogTextBox.MaxLength - 1024))
161+ {
162+ _LogTextBox.Text = _LogTextBox.Text.Substring(_LogTextBox.MaxLength / 2);
163+ }
164+ }
165+
166+ /***********************************************************//*!
167+ * @brief ログ表示部からログをすべて削除
168+ * @details 削除されるのは表示部のみ。保存用文字列からは削除しない。
169+ **************************************************************/
170+ public void Clear()
171+ {
172+ _LogTextBox.Text = "";
173+ }
174+ }
175+}
--- tags/OfficeImageReducer_0321-181012/FormMain.Designer.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/FormMain.Designer.cs (revision 126)
@@ -0,0 +1,116 @@
1+namespace OfficeImageReducer
2+{
3+ partial class FormMain
4+ {
5+ /// <summary>
6+ /// 必要なデザイナー変数です。
7+ /// </summary>
8+ private System.ComponentModel.IContainer components = null;
9+
10+ /// <summary>
11+ /// 使用中のリソースをすべてクリーンアップします。
12+ /// </summary>
13+ /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
14+ protected override void Dispose(bool disposing)
15+ {
16+ if (disposing && (components != null))
17+ {
18+ components.Dispose();
19+ }
20+ base.Dispose(disposing);
21+ }
22+
23+ #region Windows フォーム デザイナーで生成されたコード
24+
25+ /// <summary>
26+ /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
27+ /// コード エディターで変更しないでください。
28+ /// </summary>
29+ private void InitializeComponent()
30+ {
31+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
32+ this.textBox1 = new System.Windows.Forms.TextBox();
33+ this.button1 = new System.Windows.Forms.Button();
34+ this.button2 = new System.Windows.Forms.Button();
35+ this.button3 = new System.Windows.Forms.Button();
36+ this.SuspendLayout();
37+ //
38+ // textBox1
39+ //
40+ this.textBox1.AllowDrop = true;
41+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
42+ | System.Windows.Forms.AnchorStyles.Left)
43+ | System.Windows.Forms.AnchorStyles.Right)));
44+ this.textBox1.Location = new System.Drawing.Point(12, 12);
45+ this.textBox1.Multiline = true;
46+ this.textBox1.Name = "textBox1";
47+ this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
48+ this.textBox1.Size = new System.Drawing.Size(510, 207);
49+ this.textBox1.TabIndex = 0;
50+ this.textBox1.WordWrap = false;
51+ this.textBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.textBox1_DragDrop);
52+ this.textBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.textBox1_DragEnter);
53+ //
54+ // button1
55+ //
56+ this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
57+ this.button1.Location = new System.Drawing.Point(12, 225);
58+ this.button1.Name = "button1";
59+ this.button1.Size = new System.Drawing.Size(104, 27);
60+ this.button1.TabIndex = 1;
61+ this.button1.Text = "About";
62+ this.button1.UseVisualStyleBackColor = true;
63+ this.button1.Click += new System.EventHandler(this.button1_Click);
64+ //
65+ // button2
66+ //
67+ this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
68+ | System.Windows.Forms.AnchorStyles.Right)));
69+ this.button2.Location = new System.Drawing.Point(122, 225);
70+ this.button2.Name = "button2";
71+ this.button2.Size = new System.Drawing.Size(279, 27);
72+ this.button2.TabIndex = 2;
73+ this.button2.Text = "Clear Log";
74+ this.button2.UseVisualStyleBackColor = true;
75+ this.button2.Click += new System.EventHandler(this.button2_Click);
76+ //
77+ // button3
78+ //
79+ this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
80+ this.button3.Location = new System.Drawing.Point(407, 225);
81+ this.button3.Name = "button3";
82+ this.button3.Size = new System.Drawing.Size(115, 27);
83+ this.button3.TabIndex = 3;
84+ this.button3.Text = "Quit";
85+ this.button3.UseVisualStyleBackColor = true;
86+ this.button3.Click += new System.EventHandler(this.button3_Click);
87+ //
88+ // FormMain
89+ //
90+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
91+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
92+ this.ClientSize = new System.Drawing.Size(534, 261);
93+ this.Controls.Add(this.button3);
94+ this.Controls.Add(this.button2);
95+ this.Controls.Add(this.button1);
96+ this.Controls.Add(this.textBox1);
97+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
98+ this.MinimumSize = new System.Drawing.Size(400, 150);
99+ this.Name = "FormMain";
100+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
101+ this.Text = "FormMain";
102+ this.Load += new System.EventHandler(this.FormMain_Load);
103+ this.ResumeLayout(false);
104+ this.PerformLayout();
105+
106+ }
107+
108+ #endregion
109+
110+ private System.Windows.Forms.TextBox textBox1;
111+ private System.Windows.Forms.Button button1;
112+ private System.Windows.Forms.Button button2;
113+ private System.Windows.Forms.Button button3;
114+ }
115+}
116+
--- tags/OfficeImageReducer_0321-181012/Properties/AssemblyInfo.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/Properties/AssemblyInfo.cs (revision 126)
@@ -0,0 +1,36 @@
1+using System.Reflection;
2+using System.Runtime.CompilerServices;
3+using System.Runtime.InteropServices;
4+
5+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
6+// アセンブリに関連付けられている情報を変更するには、
7+// これらの属性値を変更してください。
8+[assembly: AssemblyTitle("")]
9+[assembly: AssemblyDescription("")]
10+[assembly: AssemblyConfiguration("")]
11+[assembly: AssemblyCompany("")]
12+[assembly: AssemblyProduct("")]
13+[assembly: AssemblyCopyright("")]
14+[assembly: AssemblyTrademark("")]
15+[assembly: AssemblyCulture("")]
16+
17+// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
18+// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
19+// その型の ComVisible 属性を true に設定してください。
20+[assembly: ComVisible(false)]
21+
22+// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります
23+[assembly: Guid("190d3215-8be6-429c-be2a-8883381105a2")]
24+
25+// アセンブリのバージョン情報は次の 4 つの値で構成されています:
26+//
27+// メジャー バージョン
28+// マイナー バージョン
29+// ビルド番号
30+// Revision
31+//
32+// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます
33+// 既定値にすることができます:
34+// [assembly: AssemblyVersion("1.0.*")]
35+[assembly: AssemblyVersion("1.0.0.0")]
36+[assembly: AssemblyFileVersion("1.0.0.0")]
--- tags/OfficeImageReducer_0321-181012/Properties/Resources.Designer.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/Properties/Resources.Designer.cs (revision 126)
@@ -0,0 +1,63 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// このコードはツールによって生成されました。
4+// ランタイム バージョン:4.0.30319.42000
5+//
6+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7+// コードが再生成されるときに損失したりします。
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace OfficeImageReducer.Properties {
12+ using System;
13+
14+
15+ /// <summary>
16+ /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
17+ /// </summary>
18+ // このクラスは StronglyTypedResourceBuilder クラスが ResGen
19+ // または Visual Studio のようなツールを使用して自動生成されました。
20+ // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
21+ // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
22+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
23+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25+ internal class Resources {
26+
27+ private static global::System.Resources.ResourceManager resourceMan;
28+
29+ private static global::System.Globalization.CultureInfo resourceCulture;
30+
31+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32+ internal Resources() {
33+ }
34+
35+ /// <summary>
36+ /// このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。
37+ /// </summary>
38+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39+ internal static global::System.Resources.ResourceManager ResourceManager {
40+ get {
41+ if (object.ReferenceEquals(resourceMan, null)) {
42+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OfficeImageReducer.Properties.Resources", typeof(Resources).Assembly);
43+ resourceMan = temp;
44+ }
45+ return resourceMan;
46+ }
47+ }
48+
49+ /// <summary>
50+ /// 厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
51+ /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
52+ /// </summary>
53+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54+ internal static global::System.Globalization.CultureInfo Culture {
55+ get {
56+ return resourceCulture;
57+ }
58+ set {
59+ resourceCulture = value;
60+ }
61+ }
62+ }
63+}
--- tags/OfficeImageReducer_0321-181012/Properties/Settings.Designer.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/Properties/Settings.Designer.cs (revision 126)
@@ -0,0 +1,26 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// このコードはツールによって生成されました。
4+// ランタイム バージョン:4.0.30319.42000
5+//
6+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7+// コードが再生成されるときに損失したりします。
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace OfficeImageReducer.Properties {
12+
13+
14+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.3.0.0")]
16+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17+
18+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19+
20+ public static Settings Default {
21+ get {
22+ return defaultInstance;
23+ }
24+ }
25+ }
26+}
--- tags/OfficeImageReducer_0321-181012/Program.cs (nonexistent)
+++ tags/OfficeImageReducer_0321-181012/Program.cs (revision 126)
@@ -0,0 +1,22 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Threading.Tasks;
5+using System.Windows.Forms;
6+
7+namespace OfficeImageReducer
8+{
9+ static class Program
10+ {
11+ /// <summary>
12+ /// アプリケーションのメイン エントリ ポイントです。
13+ /// </summary>
14+ [STAThread]
15+ static void Main()
16+ {
17+ Application.EnableVisualStyles();
18+ Application.SetCompatibleTextRenderingDefault(false);
19+ Application.Run(new FormMain());
20+ }
21+ }
22+}