3

いくつかの写真を表示する画像ギャラリーを含むac#アプリケーションがあります。このギャラリーには、左右の回転などの機能があります。すべてが完璧ですが、ギャラリーから画像を選択して回転ボタンを押すと(左または右の回転に関係なく)、画像のサイズが大幅に大きくなります。画像の形式はJPEGであることに注意してください。

回転前の画像のサイズ:278 kb

回転後の画像のサイズ:780 kb

ローテーションの私のコードは次のようなものです:

 public Image apply(Image img)
    {  
        Image im = img;
        if (rotate == 1) im.RotateFlip(RotateFlipType.Rotate90FlipNone);
        if (rotate == 2) im.RotateFlip(RotateFlipType.Rotate180FlipNone);
        if (rotate == 3) im.RotateFlip(RotateFlipType.Rotate270FlipNone);

        //file size is increasing after RotateFlip method

        if (brigh != DEFAULT_BRIGH ||
            contr != DEFAULT_CONTR ||
            gamma != DEFAULT_GAMMA)
        {
            using (Graphics g = Graphics.FromImage(im))
            {
                float b = _brigh;
                float c = _contr;
                ImageAttributes derp = new ImageAttributes();
                derp.SetColorMatrix(new ColorMatrix(new float[][]{
                        new float[]{c, 0, 0, 0, 0},
                        new float[]{0, c, 0, 0, 0},
                        new float[]{0, 0, c, 0, 0},
                        new float[]{0, 0, 0, 1, 0},
                        new float[]{b, b, b, 0, 1}}));
                derp.SetGamma(_gamma);
                g.DrawImage(img, new Rectangle(Point.Empty, img.Size),
                    0, 0, img.Width, img.Height, GraphicsUnit.Pixel, derp);
            }
        }
        return im; 
    }

何が問題ですか?

4

3 に答える 3

6

あなたの場合、適用RotateFlipはからにim変更されています。デフォルトでは、画像を保存するとデフォルトが使用されます。これは、によって返される形式になりますImageFormatJpegMemoryBmpImageFormatim.RawFormat

GUIDを確認するとim.RawFormat.Guid

RotateFlip の前

{b96b3cae-0728-11d3-9d7b-0000f81ef32e} と同じですImageFormat.Jpeg.Guid

RotateFlip 後

{b96b3caa-0728-11d3-9d7b-0000f81ef32e} と同じですImageFormat.MemoryBmp.Guid

画像を保存するときにImageFormat、正しい形式を使用することを保証する 2 番目のパラメーターとして を渡します。言及されていない場合、それはim.RawFormat

なので、通話保存時にjpegで保存したい場合は

im.Save("filename.jpg", ImageFormat.Jpeg);

今回は、ファイル サイズが元のサイズよりも小さくなるはずです。

名前空間にも注意ImageFormatしてくださいSystem.Drawing.Imaging

ノート

jpeg の品質を制御するには、このMSDN リンクに記載されているオーバーロードされた Save メソッドを使用します。


コメントに基づく編集

SQL Server を使用していると仮定すると、imageデータ型の列が必要です (将来的には廃止されるため、varbinary(max)代わりに使用することをお勧めします ( MSDN の投稿を読む)image

では手順へ

1) read the contents as a stream / byte[] array

2) convert this to Image

3) perform rotate operation on the Image

4) convert this Image back to stream / byte[] array

5) Update the database column with the new value
于 2012-05-27T08:03:47.667 に答える
1

2 つの理由:

  1. JPEG 圧縮/エンコード/サンプリングは、元の JPEG として最適化されていません。
  2. JPEGは透明ではありません。画像が 90/180/270 度回転されていない場合、画像の四角形の境界が大きくなります。
于 2012-05-27T06:51:28.983 に答える