• R/O
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javaandroidc++linuxobjective-cc#cocoa誰得qtrubygamebathyscaphephpgui翻訳windowspythoncomegattwittertestframeworkbtronarduinovb.net計画中(planning stage)directxpreviewerゲームエンジンdom

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


Commit MetaInfo

Revision149 (tree)
Time2019-03-25 21:40:49
Authorhor931101jp

Log Message

(empty log message)

Change Summary

Incremental Difference

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