У меня есть следующий код, размещенный при нажатии кнопки. После нажатия кнопки кнопка выбирает изображение для загрузки.Изменение размера изображения на разных уровнях, создавая изображения разных размеров
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);
}
}
Оба кода одинаковы, но выходные изображения имеют разные размеры и это тоже большое различие в размере. Пожалуйста, помогите мне понять, почему это поведение. Я хочу, чтобы вы не загружали изображение большого размера, читая их как поток и повторно определяя их, прежде чем загружать их на диск. Но размер после повторной калибровки слишком велик, чтобы принять его.
Также, если кто-то может поделиться своими мыслями о том, как сжимать и имитировать.
Заранее спасибо
Вы хотите проверить размер изображения перед его загрузкой? –
И вам, возможно, повезло с помощью http://imageresizing.net/ –