0

Я пытаюсь повернуть изображение после сканирования, чтобы улучшить читаемость отсканированных изображений, если угол наклона слишком высок. Узнав угол Deskew, я пытаюсь повернуть изображение с помощью следующего кода.Размер файла изображения Увеличивается почти до 10 раз после поворота его на определенный угол

После поворота изображения и сохранения его впоследствии размер моего изображения увеличивается до 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); 
+0

У вас есть вопросы? –

+0

Yep :) .. Я хотел понять, почему увеличивается размер файла? – amithkrp07

+0

Поскольку вы распаковали исходный вход, а затем, когда вы сохранили его на диск, вы не сжимали его на столько же. –

ответ

0

Я предполагаю, что у вас есть очень высокое качество в ваших параметров кодирования.

Попробуйте сохранить его с чем-то вроде:

EncoderParameters myEncoderParameters = new EncoderParameters(1); 

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

Это позволит сохранить его в формате JPEG качество 50%. Вы можете попробовать настроить его, чтобы получить желаемое качество и размер.

+0

Hi Gerard, Я уже это делаю. System.Drawing.Imaging.Encoder myEncoder; myEncoder = System.Drawing.Imaging.Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters (1); EncoderParameter myEncoderParameter = новый EncoderParameter (myEncoder, 50L); myEncoderParameters.Param [0] = myEncoderParameter; ImageCodecInfo myImageCodecInfo = GetEncoder (ImageFormat.Tiff); temp.Save («C: \\ Desktop \\ Новая папка \\ 1.Tiff», myImageCodecInfo, myEncoderParameters); И не повезло с уменьшением размера :( – amithkrp07

+0

Я не привык к формату файла Tiff, но он может содержать форматы изображений с потерями (с низким размером файла) и без потерь (с высоким размером файла). Возможно, вы читаете файл с потерями (например, jpeg) и сохранение его как файла с потерями без потерь. –

 Смежные вопросы

  • Нет связанных вопросов^_^