2016年12月31日土曜日

HP 210aで年賀状を印刷する 2017年版

今年も結局昨年と同様のスケジュール
なぜもっと早くできない!! の反省会


設定・手順は昨年版を参照(の方が詳しい)

レイヤーの写真を張り変えるテンプレ作業はいつもより早かったと思うが...やはりいろいろトラブルがあって大掃除しながら2.5日程度かかっている感じ

---
画像のリサイズ
0. お好みの写真を選択し、1071x832の縦横比でトリミング
1. 画像 -> 画像拡大縮小 で 1071x832
2. 画像 -> キャンバスサイズ で、↑になっていなければ同じサイズにする

こんな感じで行けたような...

---
画像をはがきテンプレに貼る
1. はがきテンプレとしたxcfのファイルを開く
2. ("レイヤー"ダイアログが表示されていない場合は、画像が出ているウィンドウの"ダイアログ -> レイヤー"を選択すると表示される)
3. 写真が表示されているレイヤーに、上記"画像のリサイズ"で作ったxcfをドラッグアンドドロップ
4. 古い写真レイヤーが表示されているが、不要なので削除
5. "The GIMP"ダイアログの移動アイコン(矢印の十字)を選択して、写真のレイヤーをつかんでよさそうな位置に移動する

---
レイヤーを重ねた上で、写真を鮮やかにしたい
1. "レイヤー"ダイアログで、写真を配置したレイヤーを選択
2. レイヤー -> 色 -> 色相・彩度で、彩度を思いっきり上げると派手な感じになってよさげ

---
印刷
- GIMPから印刷する

1. レイヤー -> 下のレイヤーと結合 を繰り返して、レイヤーを1枚にする
2. GIMPからファイル -> 印刷
3. プリンターを"ネットワーク"に設定(印刷する度にリセットされるようだ)
 給紙トレイ : フォト
 用紙サイズ : はがき
 メディア   : インクジェット紙
4. 詳細設定で
 出力品質 : 高画質 にする
 (ICMが"写真"になっていたりするのは"3"の設定で反映されている模様?)
 フチあり印刷で良い

---
HP-209aはがきトレイ不具合
なかなか給紙しない -> 宛名面にそらせたり、給紙する際に押してやると有効

---
インク
- amazonで350円代で3本のが、一昨年とは別の店で売っているので、プリンタを動作確認してよさそうなら早めに買っておく
- で、28日くらいに注文すると、年明けになってしまうので、今年もあきらめ
- チェックすると 青・赤・黒(つまり黄色以外)がテスト印刷でカスレ始める
- 近所だと意外に高い(4000円程度)ので諦め
- 互換インクがあったので、4色買う (約3000円。ポイント使用)
  実は、スーパーにもあって値段は一緒。バーゲンで5%オフならスーパー有利だが、
  今回はipad買ったときのポイントで購入(他に購入予定のものもないし...)
- 結局黄色も途中で切れたので、よかったのだが... 黒が5枚程度の印刷でカスレる orz
- 古いカートリッジ(純正)につけかえると、いくらかましな印刷だったので、ヘッド目詰まりではなさそう
- 翌日(12/31)にお店で交換
- とりあえずこれで今回はなんとかなった (損失5枚)

インクは毎回もめる...
早めにプリンタのテストして、amazonで買っておくのがよさそうだ
(値段が全然違うので、不良品ならそこだけ純正買えばよいのだし)




2016年12月15日木曜日

タスクとUI表示 その1

(長い処理を行いたい場合など)Worker threadとUI threadの関係はやや面倒で、
- 描画はUI threadで行う
- UI threadで長い処理を行うと描画が固まる
- 長時間処理はworker threadで行えば画面固まらない
- でも描画はUI threadで行わないといけない

ということで、background workerだったり、invokeで描画させたりなど、昔から面倒だった訳ですが、最近?はasync/awaitが非同期処理の流行りのようです。

実験的に作ったアプリは
- 長時間処理用と仮定したtaskを生成する
- 上記taskから描画表示を行う
という処理を、async/awaitとinvokeを使って書いてみます。

formのデザイン画面には
- taskを開始するボタン
- 状態を表示するUIとしてtextbox
を配置します。

textboxでは、taskから1秒ごとに時間を表示させます。
taskが終了したらUI threadで"終了した"表示を行います。

表示部分のポイントは
textBox_dispTime.Invoke(new Action(() => { textBox_dispTime.Text = DateTime.Now.ToString(); }));
の部分で、
UI部品.Invoke(デリゲート);
という感じの模様。
これでtask側からtextBox_dispを操作する事ができました。
 
taskについてのポイントは
- await Task.Run(() => workThread()); として、awaitキーワードをつけたTask.Run()する
- awaitキーワードを使うメソッドには"async"キーワードを付ける
となり、動作としては、
- UIスレッドはawaitで待ち
- task側からUI(textBox)を操作
- workThread()が終了すると、その次のメソッド(UIスレッドからtextboxに"終了"を書く)実行

という感じでした。

ソースコード

using System.Threading;


namespace TestAwait01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // awaitキーワードを使うメソッドはasyncキーワードをつけておく
        private async void button_TaskStart_Click(object sender, EventArgs e)
        {
            await Task.Run(() => workThread());         // workThreadの処理をtaskで実行

            textBox_dispTime.Text = "終了";
        }

        // threadとして実行するメソッド
        private void workThread()
        {
            for(int i = 0; i < 10; i++) {
                // textBox_dispTime.Text = DateTime.Now.ToString(); // コレは表示されない
                textBox_dispTime.Invoke(new Action(() => { textBox_dispTime.Text = DateTime.Now.ToString(); }));
                Thread.Sleep(1000);
            }
        }

    }