画像の解像度を変換する

【注意】画像エンコードのことは全然詳しくないので、本質的に正しいやり方なのか不明。

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 でも可。

参考