
こいつを再度 Photoshop CS で開き、[イメージ]-[画像解像度] で解像度を 144pixel/inch、バイキュービック法で画像の再サンプル、てな処理をする。
すると [ピクセル数] の幅と高さも連動して小さくなる。300dpi を 144dpi にしたので 0.48倍。なので幅と高さも元のサイズの 0.48倍になってる。
最後にこいつを [ファイル]-[別名保存] で JPEG 保存する。オプションとしては [カラー] の "ICC プロファイル" にチェック。画像品質は "8(高)"、形式オプションは "ベースライン(標準)" にする。
んな感じの処理を C# で。
.NET ではプログレッシブ JPEG で保存できないっぽいってことは標準ベースラインで保存されてるって解釈しちゃってもいいのかな・・・
とりあえず web から漁ったサンプルを改造したりして作ってみたので整理されてない・・・
幅 3,509ピクセル、高さ 2,883ピクセル、水平解像度 300dpi、垂直解像度 300dpi、ビットの深さ 24、フレーム数 1、サイズ 989,166バイトな JPEG 画像
【Photoshop での処理結果】
幅 1,684ピクセル、高さ 1,384ピクセル、水平解像度 144dpi、垂直解像度 144dpi、ビットの深さ 24、フレーム数 1、サイズ 215,064バイト。
【プログラムでの処理結果】
幅 1,684ピクセル、高さ 1,384ピクセル、水平解像度 144dpi、垂直解像度 144dpi、ビットの深さ 24、フレーム数 1、サイズ 209,048バイト。
幅と高さを決めるところは System.Math.Round() を使って丸めこんだ。
JPEG 圧縮品質はとりあえず 82 にしてみた。83 に上げるとサイズが 223,824バイト。
んまぁこんな感じじゃないですかね。
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; class Program { static void Main(string[] args) { const string sourceFile = "e:\\src300.jpg"; const float newResolution = 144f; const Int64 quality = 82; FileStream fs = new FileStream(sourceFile, FileMode.Open, FileAccess.Read); Bitmap src = new Bitmap(fs); fs.Close(); float srcResolution = src.HorizontalResolution; float resolutionRatio = newResolution / srcResolution; int newW = (int)System.Math.Round((float)src.Width * resolutionRatio); int newH = (int)System.Math.Round((float)src.Height * resolutionRatio); Bitmap dest = new Bitmap(newW, newH); Graphics g = Graphics.FromImage(dest); g.InterpolationMode = InterpolationMode.Bicubic; g.DrawImage(src, 0, 0, newW, newH); dest.SetResolution(newResolution, newResolution); // 保存する。 dest.Save("e:\\thumb" + quality.ToString() + ".jpg", CreateJpegCodecInfo(), CreateJpegEncParams(quality)); } /// <summary> /// JPEG 用の ImageCodecInfo を返す /// </summary> /// <returns></returns> static ImageCodecInfo CreateJpegCodecInfo() { ImageCodecInfo codecInfo = null; foreach (ImageCodecInfo ici in ImageCodecInfo.GetImageEncoders()) { if (ici.FormatID == ImageFormat.Jpeg.Guid) { codecInfo = ici; break; } } return codecInfo; } /// <summary> /// JPEG の圧縮オプションを設定した EncoderParameters を返す /// </summary> /// <param name="quality">品質値 0(最低)〜100(最高)</param> static EncoderParameters CreateJpegEncParams(Int64 quality) { EncoderParameter ep = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality,quality); EncoderParameters eps = new EncoderParameters(1); eps.Param[0] = ep; return eps; } }【ソース画像】
幅 3,509ピクセル、高さ 2,883ピクセル、水平解像度 300dpi、垂直解像度 300dpi、ビットの深さ 24、フレーム数 1、サイズ 989,166バイトな JPEG 画像
【Photoshop での処理結果】
幅 1,684ピクセル、高さ 1,384ピクセル、水平解像度 144dpi、垂直解像度 144dpi、ビットの深さ 24、フレーム数 1、サイズ 215,064バイト。
【プログラムでの処理結果】
幅 1,684ピクセル、高さ 1,384ピクセル、水平解像度 144dpi、垂直解像度 144dpi、ビットの深さ 24、フレーム数 1、サイズ 209,048バイト。
幅と高さを決めるところは System.Math.Round() を使って丸めこんだ。
JPEG 圧縮品質はとりあえず 82 にしてみた。83 に上げるとサイズが 223,824バイト。
んまぁこんな感じじゃないですかね。
コメント