2016-01-05 1 views
6

私はカメラから撮影した画像をXamarin.Formsで250kbのサイズに圧縮しようとしています。私は依存サービスでそれを行う方法を見つけましたが、依存サービス(純粋なxamarin.formsコード)なしでそれを必要としています。どのようにそれが可能です。誰かが私にあなたが持っている最良のアプローチを提案できますか?事前依存関係サービスなしのxamarin.formsを使用して画像のサイズを250kbに圧縮

+12

「純粋な」フォームコードで行う方法はないと思います。イメージロジックをすべてゼロから作成したい場合は、膨大な量のコードにする必要があります。各プラットフォームの高度に最適化されたネイティブイメージ処理機能を利用することは、DIを使用するように強制しても、はるかに良い方法のように思えます。 – Jason

+0

.NET参照ライブラリのオブジェクトブラウザで確認すると、System.Drawingポータブルライブラリが表示されます。そのライブラリをインポートするには? –

+1

system.drawingでは、この回答を使用できます。 http://stackoverflow.com/a/24199315/5495701 – Slepz

答えて

12

おかげであなたは画像処理に関する知識のトンを必要とするので、それは非常に複雑な仕事です。

最も重要なことに、ホイールを再発明することは悪い動きです。

http://www.codeproject.com/Articles/83225/A-Simple-JPEG-Encoder-in-C

のみJPEGに取り組む上のコードプロジェクトのを見てみましょう。 TIFF、GIF、BMPなどとは言わないでください。

イメージ圧縮には、DCTやハフマンのような複雑な数学的変換が多数含まれています。

これらの基礎を学ぶには、大学全体の学期が必要です。


一方、プラットフォームサポートを賢く利用すると、1分以内にタスクを完了できます。

Windows PhoneのBitmapEncoder .NET FrameworkでのiOS

でAndroidの

using (System.IO.Stream stream = System.IO.File.Create(targetFile)) 
{ 
    bitmap.Compress(Bitmap.CompressFormat.Jpeg, 30, stream); 
} 

UIImage

FileStream stream = new FileStream("new.jpg", FileMode.Create); 
JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
encoder.QualityLevel = 30; 
encoder.Frames.Add(BitmapFrame.Create(image)); 
encoder.Save(stream); 

ビットマップ

NSData data = image.AsJPEG(0.3); 

ビットマップ

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
ImageCodecInfo codec = codecs.First(t => t.FormatID == ImageFormat.Jpeg.Guid); 
EncoderParameters parameters = new EncoderParameters(1); 
parameters.Param[0] = new EncoderParameter(Encoder.Quality, 30L); 
bitmap.Save("output.jpg", codec, parameters); 
+0

ありがとう!私が必要としたもののように見える – nicks

関連する問題