0

スキュー角度が高すぎる場合に、スキャンした画像の読みやすさを改善するために、スキャン後に画像を回転させようとしています。デスキュー角度を見つけた後、次のコードで画像を回転させようとしています。

画像を回転させて保存すると、画像サイズが10倍に近くなります。

画像のファイル サイズが増加する理由は何ですか?

   public  Bitmap RotateImage(Image inputImage, float angleDegrees, bool upsizeOk,
                                 bool clipOk, Color backgroundColor)
    {
    /// Method to rotate an Image object. The result can be one of three cases:
    /// - upsizeOk = true: output image will be larger than the input, and no clipping occurs 
    /// - upsizeOk = false & clipOk = true: output same size as input, clipping occurs
    /// - upsizeOk = false & clipOk = false: output same size as input, image reduced, no clipping
    /// 

    // Test for zero rotation and return a clone of the input image
    if (angleDegrees == 0f)
    return (Bitmap)inputImage.Clone();

    // Set up old and new image dimensions, assuming upsizing not wanted and                         clipping OK
    int oldWidth = inputImage.Width;
    int oldHeight = inputImage.Height;
    int newWidth = oldWidth;
    int newHeight = oldHeight;
    float scaleFactor = 1f;

    // If upsizing wanted or clipping not OK calculate the size of the resulting bitmap
    if (upsizeOk || !clipOk)
    {
    double angleRadians = angleDegrees * Math.PI / 180d;

    double cos = Math.Abs(Math.Cos(angleRadians));
    double sin = Math.Abs(Math.Sin(angleRadians));
    newWidth = (int)Math.Round(oldWidth * cos + oldHeight * sin);
    newHeight = (int)Math.Round(oldWidth * sin + oldHeight * cos);
    }

    // If upsizing not wanted and clipping not OK need a scaling factor
    if (!upsizeOk && !clipOk)
    {
     scaleFactor = Math.Min((float)oldWidth / newWidth, (float)oldHeight / newHeight);
     newWidth = oldWidth;
     newHeight = oldHeight;
        }

        // Create the new bitmap object. If background color is transparent it must be 32-bit, 
        //  otherwise 24-bit is good enough.
        Bitmap newBitmap = new Bitmap(newWidth, newHeight, backgroundColor == Color.Transparent ?
                                         PixelFormat.Format32bppArgb : PixelFormat.Format24bppRgb);
        newBitmap.SetResolution(inputImage.HorizontalResolution, inputImage.VerticalResolution);



        // Create the Graphics object that does the work
        using (Graphics graphicsObject = Graphics.FromImage(newBitmap))
        {
           // graphicsObject.InterpolationMode = InterpolationMode.HighQualityBicubic;
           // graphicsObject.PixelOffsetMode = PixelOffsetMode.HighQuality;
           // graphicsObject.SmoothingMode = SmoothingMode.HighQuality;

            // Fill in the specified background color if necessary
            if (backgroundColor != Color.Transparent)
                graphicsObject.Clear(backgroundColor);

            // Set up the built-in transformation matrix to do the rotation and maybe scaling
            graphicsObject.TranslateTransform(newWidth / 2f, newHeight / 2f);

            if (scaleFactor != 1f)
                graphicsObject.ScaleTransform(scaleFactor, scaleFactor);

            graphicsObject.RotateTransform(angleDegrees);
            graphicsObject.TranslateTransform(-oldWidth / 2f, -oldHeight / 2f);

            // Draw the result 
            graphicsObject.DrawImage(inputImage, 0, 0);
        }

        return newBitmap;
    }

そして、次の方法でビットマップを保存しています

   bmp.Save("C:\\Users\\pamit\\Desktop\\FileName.Tiff", jpgEncoder, myEncoderParameters);
4

1 に答える 1

0

私の推測では、エンコード パラメータの品質が非常に高いと思います。

次のような方法で保存してみてください。

EncoderParameters myEncoderParameters = new EncoderParameters(1);

EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;

これにより、50% の jpeg 品質で保存されます。調整して、目的の品質とサイズを得ることができます。

于 2015-04-10T15:21:57.393 に答える