Hatena::ブログ(Diary)

sakuraSoftware開発日記 このページをアンテナに追加 RSSフィード Twitter

2017-03-07

大量の画像をリサイズする。ただしフォルダ構成は変えない

21:18 | 大量の画像をリサイズする。ただしフォルダ構成は変えないを含むブックマーク

using System;
using System.Threading.Tasks;
using System.IO;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace ResizePics
{
    class Program
    {
        const string SRC_DIR = @"E:\temp\SRCDIR";
        const string DST_DIR = @"E:\temp\DSTDIR";
        const double TARGET_WIDTH = 1000;


        static void Main(string[] args)
        {
            //対象ファイル取得
            var pictures = Directory.GetFiles(SRC_DIR, "*.jpg", SearchOption.AllDirectories);

            var pOptions = new ParallelOptions();
            pOptions.MaxDegreeOfParallelism = 2;
            Parallel.ForEach(pictures,pOptions, srcFile =>
            {
                Console.WriteLine(srcFile);
                //ファイルを開いて縮小する
                using (var srcStream = File.OpenRead(srcFile))
                {
                    var decoder = BitmapDecoder.Create(srcStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                    var bitmapSource = decoder.Frames[0];

                    //縮小したビットマップを作成する
                    var scale = TARGET_WIDTH / bitmapSource.PixelWidth;  //縮小率
                    var scaledBitmapSource = new TransformedBitmap(bitmapSource, new ScaleTransform(scale, scale));

                    var encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(scaledBitmapSource));

                    //ファイルの書き出し
                    var dstFile = Microsoft.VisualBasic.Strings.Replace(srcFile, SRC_DIR, DST_DIR, 1, 1);

                    //ディレクトリがなければ作成する
                    if(!Directory.Exists(Path.GetDirectoryName(dstFile)))
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(dstFile));
                    }
                    using (var dstStream = File.OpenWrite(dstFile))
                    {
                        encoder.Save(dstStream);
                    }
                }
            });
            Console.WriteLine("END");
            Console.ReadLine();
        }
    }
}

基本的にこちらとやっていることは同じ。

http://note-sharp.blogspot.jp/2014/09/var-dir-cimages-parallel.html

Out of memoryが出たのでParallelに制限をかけたのと、pixelwidthに変更しただけです。

2017-01-31

ウルトラワイド液晶(続き)

19:15 | ウルトラワイド液晶(続き)を含むブックマーク

今日一日、ウルトラワイド液晶使ってみました。

メッチャ後悔した。


なんで繁忙期前に買っておかなかった、俺!


とにかく快適。前の環境も24インチ(くらい)×2(フルHD)だったが、圧倒的に快適さが違う。

なんせウィンドウのサイズ・場所を変更する必要がないんである。


読む画面をWindows+←で左半分に表示して、書く画面をWindows+→で右半分に表示するだけ。

幅が若干足りない所もないではないが、ほぼ誤差。3つのアプリで同時に作業することもあるけれど、そこはALT+TABだけで済むんである(画面半分にキレイに別れてるので)


しかも最大化すればフルHDの1.5倍幅の領域がExcelに割り当てられるわけで、これで某社様の仕様書もさほどストレスなく読める。すごい。


机の上もスッキリだし、これで実機置く場所も確保出来るし、その気になれば前使ってた液晶も足せるしでもういうことない。


10万以下は安かった。

2017-01-30

ウルトラワイド液晶

15:21 | ウルトラワイド液晶を含むブックマーク

仕事で23-24インチくらいのフルHD液晶を2枚使っていたんだけど、片方が古くて輝度が出ず、右と左で色が違い、GUI作ってる身としては非常にストレスフル。

顧客が提示する仕様がやたらでかいExcelで書かれていて、一覧出来ないのでコレもストレスフル

そうだ、ウルトラワイド液晶買えばいいんじゃね?

34インチなら縦幅減らないし!

ぽtっと危ない、職場PC側が対応してるかどうか確認してなかったぜ。

社内IT部署に聞く。「個人の購入はサポート外です」「ですよねー」

DELLに問い合わせ(E7240という法人向けノート)

「それは法人向けだから窓口違うよ。こっち行って」

「つないで3440×1440という表示がでたら使えます」買わないとわからんじゃないか!

ヨドバシに行ってノートを3440×1440のディスプレイにつながせてもらう。出る。しかしDockを使用するので若干の不安が残る。

「…つうか、家の4Kディスプレイにつないで何事もなく映ったんだからどうにかなるんじゃね?」

ぽち

今日会社に届いたので早速セットアップ(今日は有給)。映る。イエーイ。

顧客仕様を画面に出してみる→それでも全部は入らないが大分改善されたイエーイ。


なお、弊社の人々は「…またバカなことやってる…」という空気が出ていたことをお伝えすると共に、箱が折りたたみ自転車ぐらいの大きさであったことをお伝えして了。

2016-08-14

PNG画像を組み合わせて画像を吐き出す

| 16:49 | PNG画像を組み合わせて画像を吐き出すを含むブックマーク

仕事で「画像ファイルは提供します。組み合わせはそっちで作ってください」と言うことになり、PNGファイルを組み合わせた画像を大量に作る作業が発生したので、C#でちゃらっと書いてみました。(仕事の方だと組み合わせの数が跳ね上がるので、一部関数にする可能性大ですが、参考にはなろうという意味で置いておきます)

サンプルコードを見てみてはじめ意味がわからなかったんですが、GraphicsオブジェクトがBitmapオブジェクトに書き込みやってるんですね。

(リファクタリングしました。まだ読みにくいなぁ)

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
namespace PicLay
{
    class Program
    {
        static void Main(string[] args)
        {
            var pics = new List<string> {
                    @"E:\temp\PicLaySample\01.png",     //画像1〜3
                    @"E:\temp\PicLaySample\02.png",
                    @"E:\temp\PicLaySample\03.png",
                    @"E:\temp\PicLaySample\04.png",
                    @"E:\temp\PicLaySample\base.png"     //背景画像
            };

            var inPicNum = pics.Count-1;
            var picNum = Math.Pow(2, inPicNum);

            for(var i=1;i< picNum; i++)    //iは出力ファイル名。各ビットの1に対してPNGを合成する。
            {
                using (var resultPic = new Bitmap(pics.Last())) //背景画像作成
                {
                    var g = Graphics.FromImage(resultPic);
                    for (var j = 0; j < inPicNum; j++)          //各画像の書き込みチェック
                    {

                        if ((i & (int)(Math.Pow(2,j))) != 0)                  //対象が書き込み画像であれば
                        {
                            using (var addPic = new Bitmap(pics[j]))
                            {
                                g.DrawImage(addPic, 0, 0, addPic.Width, addPic.Height);
                            }
                        }
                    }
                    //書き出し
                    var fileName = i.ToString("D3") + ".png";
                    var targetName = @"E:\temp\PicLaySample\test" + Path.DirectorySeparatorChar + fileName;
                    resultPic.Save(targetName, ImageFormat.Png);
                }
            }
        }
    }
}