17338

[code]

    // 送られたパスの画像を圧縮する
    private string ImageCoder(string path)
    {
        int fileCount = Directory.GetFiles(path).Count();
        string[] fileTitles = Directory.GetFiles(path);
        Array.Sort(fileTitles, new LogicalStringComparer());
    
        string dirResize = path + @"\resize\";
        Directory.CreateDirectory(dirResize);
    
        ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
        System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters myEncoderParameters = new EncoderParameters(1);
    
        for (int i = 0; i < fileCount; i++)
        {
            System.Drawing.Bitmap bmpSrc = new System.Drawing.Bitmap(fileTitles[i]);
            System.Drawing.Bitmap bmpSrcHalf = new System.Drawing.Bitmap
                    (bmpSrc, RE_WIDTH, (int)(bmpSrc.Height * ((double)RE_WIDTH) / (double)(bmpSrc.Width)));
    
            EncoderParameter myEncoderParameter =
                new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, RE_COMP);
    
            myEncoderParameters.Param[0] = myEncoderParameter;
            bmpSrcHalf.Save(dirResize + (i + 1) + ".jpg", jgpEncoder, myEncoderParameters);
    
            FileInfo fileInfo = new FileInfo(dirResize + (i + 1) + ".jpg");
            long reComp = RE_COMP;
    
            if (fileInfo.Length < 3000)
            {
                ShowBalloon("画像は削除されています。処理を中断します。");
                break;
            }
    
            while (fileInfo.Length > RE_SIZE)
            {
                myEncoderParameter = new EncoderParameter(myEncoder, (reComp = reComp - 3));
                myEncoderParameters.Param[0] = myEncoderParameter;
                bmpSrcHalf.Save(dirResize + (i + 1) + ".jpg", jgpEncoder, myEncoderParameters);
                fileInfo = new FileInfo(dirResize + (i + 1) + ".jpg");
            }
        }
    
        // ZIP化
        ZipStream(dirResize, path);
    
        return dirResize;
    }
    private ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
            if (codec.FormatID == format.Guid)
                return codec;
        return null;
    }
    
    
    // 送られたパスのファイルをソートする
    private string[] FileSort(string path)
    {
        string[] fileNames = Directory.GetFiles(path);
        fileNames = fileNames.OrderBy(n =>
        {
            int v = 0;
            if (int.TryParse(Path.GetFileNameWithoutExtension(n), out v))
            {
                return v;
            }
            return 9999999; // 数字で無いファイル名は一番後ろになる様に
        }).ToArray();
    
        return fileNames;
    }
    
[/code]


CC BY-SA 3.0
2015-10-07T04:27:46.613
17336
2015-10-07T05:45:13.553
7973
question
c#
画像のファイルサイズと大きさを縮小しZIP圧縮するのですが、もう少しコードを短縮できないでしょうか？


`LogicalStringComparer`、`GetEncoder`、`FileSort`の機能は取り込みました。  
コメントに従い10KBで判定しました。  
`GetImageDecoders()`でなく`GetImageEncoders()`を使いました。  
きちんとリソース解放しました。  
毎回ファイルに書き出さず、メモリ上で処理して最終結果だけをファイルに書き出しました。

[code]

    // 送られたパスの画像を圧縮する
    private string ImageCoder(string path) {
        var fileTitles = Directory.GetFiles(path).OrderBy(n => {
            int v = 0;
            return Int32.TryParse(Path.GetFileNameWithoutExtension(n), out v) ? v : 9999999; // 数字で無いファイル名は一番後ろになる様に
        }).ToArray();
    
        var dirResize = Path.Combine(path, "resize");
        Directory.CreateDirectory(dirResize);
    
        var jpegCodec = ImageCodecInfo.GetImageEncoders().FirstOrDefault(codec => codec.FormatID == ImageFormat.Jpeg.Guid);
    
        for (int i = 0; i < fileTitles.Length; i++) {
            // １０ｋｂ程の小さい画像になって削除済みと書かれた画像がダウンロードされた場合
            if (new FileInfo(fileTitles[i]).Length < 10240) {
                ShowBalloon("画像は削除されています。処理を中断します。");
                break;
            }
            using (var original = new Bitmap(fileTitles[i]))
            using (var resized = new Bitmap(original, RE_WIDTH, (int)(original.Height * (double)RE_WIDTH / original.Width))) {
                var quality = RE_COMP;
                byte[] bytes;
                do {
                    using (var memory = new MemoryStream()) {
                        resized.Save(memory, jpegCodec, new EncoderParameters { Param = new[] { new EncoderParameter(Encoder.Quality, quality) } });
                        bytes = memory.ToArray();
                    }
                    quality -= 3;
                } while (bytes.Length > RE_SIZE);
                File.WriteAllBytes(Path.Combine(dirResize, String.Format("{0}.jpg", i + 1)), bytes);
            }
        }
    
        // ZIP化
        ZipStream(dirResize, path);
    
        return dirResize;
    }
    
[/code]


CC BY-SA 3.0
2015-10-07T05:45:13.553
17338
2015-10-07T05:45:13.553
4236
17336
answer