2014-10-02 6 views
0

У меня есть следующий код, размещенный при нажатии кнопки. После нажатия кнопки кнопка выбирает изображение для загрузки.Изменение размера изображения на разных уровнях, создавая изображения разных размеров

using (SD.Image OriginalImage = SD.Image.FromStream(AsyncUpload.FileContent)) 
     { 
      decimal dRatio = (Decimal)1024/OriginalImage.Width; 
      int iScaledW = 1024; 
      int iScaledH = (int)(OriginalImage.Height * dRatio); 
      using (SD.Bitmap bmp = new SD.Bitmap(iScaledW, iScaledH)) 
      { 
       bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution); 
       using (SD.Graphics Graphic = SD.Graphics.FromImage(bmp)) 
       { 
        Graphic.SmoothingMode =SD2.SmoothingMode.AntiAlias; 
        Graphic.InterpolationMode = SD2.InterpolationMode.HighQualityBicubic; 
        Graphic.PixelOffsetMode = SD2.PixelOffsetMode.HighQuality; 
        Graphic.FillRectangle(SD.Brushes.White, 0, 0, iScaledW, iScaledH); 
        Graphic.DrawImage(OriginalImage, 0, 0, iScaledW, iScaledH); 
        bmp.Save(Path.Combine(Server.MapPath(upPath), AsyncUpload.FileName)); 
       } 
      } 
     } 

Здесь AsyncUpload - это имя элемента управления FileUpload. Исходное изображение составляет 3,96 МБ и путем повторной калибровки изображения с помощью вышеуказанной функции создает изображение с размерами 1,92 МБ.

Однако, если я выбираю тот же самый файл 3.96MB, как кнопку, который выполняет следующий код, который просто загружает все, что предоставляется.

objfile.SaveAs(Path.Combine(Server.MapPath(upPath), AsyncUpload.FileName)); 

и нажмите кнопку, которая делает то же обработку изменения размера изображения, как упоминалось выше, он создает образ только 200KB. Ниже приведен код этой кнопки.

static byte[] Crop(string Img, int Width, int Height, int X, int Y) 
    { 
     int w = Width; 
     int h = Height; 
     int xx = X; 
     int yy = Y; 

     try 
     { 
      using (SD.Image OriginalImage = SD.Image.FromFile(Img)) 
      { 
       if (w == 0 || h == 0) 
       { 
        w = OriginalImage.Width; 
        h = OriginalImage.Height; 
       } 

       int iScaleX = 0, iScaleY = 0; 
       GetImageResolution(w, h, out iScaleX, out iScaleY); 
       using (SD.Bitmap bmp = new SD.Bitmap(iScaleX, iScaleY)) 
       { 
        bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution); 
        using (SD.Graphics Graphic = SD.Graphics.FromImage(bmp)) 
        { 
         Graphic.SmoothingMode = SmoothingMode.AntiAlias; 
         Graphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 
         Graphic.PixelOffsetMode = PixelOffsetMode.HighQuality; 
         Graphic.FillRectangle(SD.Brushes.White, 0, 0, iScaleX, iScaleY); 
         Graphic.DrawImage(OriginalImage, 0, 0, iScaleX, iScaleY); 
         bmp.Save(<Path>); 
        } 

       } 

      } 

     } 
     catch (Exception Ex) 
     { 
      return null; 
      // throw (Ex); 
     } 

    } 

Оба кода одинаковы, но выходные изображения имеют разные размеры и это тоже большое различие в размере. Пожалуйста, помогите мне понять, почему это поведение. Я хочу, чтобы вы не загружали изображение большого размера, читая их как поток и повторно определяя их, прежде чем загружать их на диск. Но размер после повторной калибровки слишком велик, чтобы принять его.

Также, если кто-то может поделиться своими мыслями о том, как сжимать и имитировать.

Заранее спасибо

+0

Вы хотите проверить размер изображения перед его загрузкой? –

+0

И вам, возможно, повезло с помощью http://imageresizing.net/ –

ответ

0

Когда оба размеры изображения и содержание являются такими же, наиболее вероятной причиной разницы в размере файла этой величины (1.92MB до 200KB) является типом сжатия.

Скорее всего, одна из двух функций - это сохранение без потерь PNG, возможно, по умолчанию 32 бит на пиксель, и это создает большой файл.

Другой, вероятно, сохраняет 24-разрядный JPEG с потерями, который дает гораздо меньший размер почти со всеми изображениями.

Чтобы проверить это, заставить формат быть JPEG, используя этот код:

bmp.Save(Path.Combine(Server.MapPath(upPath), AsyncUpload.FileName), SD.Imaging.ImageFormat.Jpeg); 

это производить ли файлы меньшего размера?

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