画像の解像度を変更するために呼び出される関数に従っています。私はこれをやりたいので、たとえば300dpiのアップロードされた画像は72dpi(ウェブ用)に変更されます。この質問は、ここでは私が取り組んでいるところでanother questionに関連しています。アップロードされた画像のC#変更dpi
私は、この機能を新しいファイルをアップロードするときだけでなく、アプリケーション内の他の場所でも使用できる拡張メソッドを作成しています。 (上記の質問を参照してください)
上記の拡張メソッドは、以下のような関数で呼び出されています。
if (newSize.Width > originalImage.Width && newSize.Height > originalImage.Height)
{
newSize.Width = originalImage.Width;
newSize.Height = originalImage.Height;
uploadedFileBuffer = uploadedFileBuffer.SetDpiTo72(uploadedFile.ContentType, newSize);
return CreateFile(newSize, uploadedFile, uploadedFileBuffer);
}
bytearrayは、bytearrayとしてファイルされています。既にサイズは正しいですが、解像度を72dpiに変更したいのですが。ただし、画像を保存して保存した後、解像度は元の解像度(300dpi)になります。これどうやってするの?いくつもの答えAFTER
UPDATE:
public static byte[] SetDpiTo72(this byte[] imageToFit, string mimeType, Size newSize)
{
using (MemoryStream memoryStream = new MemoryStream(), newMemoryStream = new MemoryStream())
{
memoryStream.Write(imageToFit, 0, imageToFit.Length);
var originalImage = new Bitmap(memoryStream);
using (var canvas = Graphics.FromImage(originalImage))
{
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage((Image)originalImage,0,0, newSize.Width, newSize.Height);
originalImage.SetResolution(72, 72);
var epQuality = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 75);
var epParameters = new EncoderParameters(1);
epParameters.Param[0] = epQuality;
Image newimg = Image.FromStream(memoryStream);
//Getting an GDI+ exception after the execution of this line.
newimg.Save("C:\\test1234.jpg", ImageFunctions.GetEncoderInfo(mimeType), epParameters);
originalImage.Save("test.jpg", ImageFormat.Jpeg);
//This line give me an Argumentexception - Parameter is not valid.
//originalImage.Save(newMemoryStream, ImageFunctions.GetEncoderInfo(mimeType), epParameters);
//newMemoryStream.Close();
}
return newMemoryStream.ToArray();
}
}
例外が付属していますstackstraceは私に次のように語っています。
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
at Extensions.ByteArrayExtensions.SetDpiTo72(Byte[] imageToFit, String mimeType, Size newSize) in C:\Website\Project\Extensions\ByteArrayExtensions.cs:line 356
at CMS.Presentation.FileFunctions.CreateFullsizeImage(HttpPostedFileBase uploadedFile, Size newSize, Byte[] uploadedFileBuffer) in C:\Website\Project\CMS.Presentation\FileFunctions.cs:line 197
at CMS.Presentation.FileFunctions.CreateFile(HttpPostedFileBase uploadedFile, INodeService nodeservice, Guid userId, Node parentNode) in C:\Website\Project\CMS.Presentation\FileFunctions.cs:line 53
私はまた、ビットマップのサイズを変更する別の機能(下記参照)を開発しました。そして、これは正しく動作するようです。私は現在の実装でこの関数を使用することはできませんが、Bitmapだけを返すためです。または、ビットマップを使用するためにすべてを変更する必要がありますか?
あなたは素晴らしい環状コードを知っていますか? newBitmap = originalImageはコピーではありません。同じImageへの参照のみ。その面白い方法はまだ動作することができます。 – Euphoric
ハハハッハッハ!変更されました;-) – Rob
Wait ..あなたの問題を実際に解決しましたか? – Euphoric