重複の可能性:
品質を損なうことなく画像のサイズを変更する
ユーザーがFileUploadから画像をアップロードし、サーバーに保存してサイズを縮小した後、アプリケーションで常に使用するコードは適切です。しかし、私がフォトショップで(手動で)同じことを行い、Facebookにファイルをアップロードすると、品質が向上し、サイズの縮小は非常に公平になります。
サーバーにアップロードした画像の品質をどのように改善できるかわかりません。別のアプローチを使用している人はいますか?
以下のコードを参照してください。
private static byte[] ReturnReducedImage(byte[] original, int width, int height)
{
Image img = RezizeImage(Image.FromStream(BytearrayToStream(original)), width, height);
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms.ToArray();
}
private static Image RezizeImage(Image img, int maxWidth, int maxHeight)
{
if (img.Height < maxHeight && img.Width < maxWidth) return img;
Bitmap cpy = null;
using (img)
{
Double xRatio = (double)img.Width / maxWidth;
Double yRatio = (double)img.Height / maxHeight;
Double ratio = Math.Max(xRatio, yRatio);
int nnx = (int)Math.Floor(img.Width / ratio);
int nny = (int)Math.Floor(img.Height / ratio);
cpy = new Bitmap(nnx, nny);
using (Graphics gr = Graphics.FromImage(cpy))
{
gr.Clear(Color.Transparent);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
gr.DrawImage(img, new Rectangle(0, 0, nnx, nny), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
}
}
return cpy;
}