画像の解像度を変換する
【注意】画像エンコードのことは全然詳しくないので、本質的に正しいやり方なのか不明。
System.Drawing.Image で読み込んで .SetResolution してもいいのだが、
var image = Image.FromFile(path); image.SetResolution(dpiX, dpiY);
System.Drawing は ASP.NET で非推奨らしい (メモリリークするとかいう噂) ので、 Windows Imaging Components を使う。
void Encode(Stream fromBitmapStream, Stream toBitmapStream, double dpiX, double dpiY) { var decoder = BitmapDecoder.Create(fromBitmapStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); var frame = decoder.Frames.First(); var stride = frame.PixelWidth * 4; // 1 ピクセルあたり 4 バイト var pixelData = new byte[frame.PixelHeight * stride]; frame.CopyPixels(pixelData, stride, 0); var source = BitmapSource.Create(frame.PixelWidth, frame.PixelHeight, dpiX, dpiY, frame.Format, frame.Palette, pixelData, stride); var encoder = new JpegBitmapEncoder() { Frames = { BitmapFrame.Create(source) } }; encoder.Save(toBitmapStream); }
PresentationCore と WindowsBase の参照が必要。で using System.Windows.Media.Imaging; する。 ちなみに BitmapDecoder とかいってるけど Jpeg でも可。