Аааа, теперь более-менее понятно.
Несколько замечаний, если позволите:
1) Я бы закачивал (сохранял на сервере) всё-таки оригиналы фоток, что бы их потом в оригинале и скачаивать/просматривать при надобности. А вот на сайте конечно показывал бы миниатюры удобного размера.
2) Размер 600х400 имеет отношение сторон 3и к 2ум. Это не очень удобно, т.к. большинство цифровых ФА такого формата вообще не имеют (Sony и Kodak имеют 3:2) а в основном 4:3. При несовпадении форматов у вас будут балки на миниатюре, либо сверху/снизу либо справа/слева.
3)Если речь идёт о фотках, то это на 90 % JPEG-файлы, сохранять миниатюры лучше тоже в JPEG и тут можно поиграться с какчеством JPEG, для изменения рзмера файла.
Код:
Функция вписывает картинку в "рамку" заданных размеров:
private Bitmap FixedSize(Bitmap imgPhoto, int Width, int Height)
{
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
int sourceX = 0;
int sourceY = 0;
int destX = 0;
int destY = 0;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)Width/(float)sourceWidth);
nPercentH = ((float)Height/(float)sourceHeight);
if(nPercentH < nPercentW)
{
nPercent = nPercentH;
destX = System.Convert.ToInt16((Width -
(sourceWidth * nPercent))/2);
}
else
{
nPercent = nPercentW;
destY = System.Convert.ToInt16((Height -
(sourceHeight * nPercent))/2);
}
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap bmPhoto = new Bitmap(Width, Height,
imgPhoto.PixelFormat);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.Clear(Color.Black); // Цвет балок.
grPhoto.InterpolationMode = InterpolationMode.Bilinear;// Интерполяция
grPhoto.DrawImage(imgPhoto,
new Rectangle(destX,destY,destWidth,destHeight),
new Rectangle(sourceX,sourceY,sourceWidth,sourceHeight),
GraphicsUnit.Pixel);
grPhoto.Dispose();
return bmPhoto;
}
|
Функция изменяет размер в зависимости от заданного процента от оригинала:
static Bitmap ScaleByPercent(Bitmap imgPhoto, float nPercent, InterpolationMode iMode)
{
//float nPercent = ((float)Percent/100);
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
int sourceX = 0;
int sourceY = 0;
int destX = 0;
int destY = 0;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap bmPhoto = new Bitmap(destWidth, destHeight,
imgPhoto.PixelFormat);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.InterpolationMode = iMode;
grPhoto.DrawImage(imgPhoto,
new Rectangle(destX,destY,destWidth,destHeight),
new Rectangle(sourceX,sourceY,sourceWidth,sourceHeight),
GraphicsUnit.Pixel);
grPhoto.Dispose();
grPhoto = null;
return bmPhoto;
} |
Не забудте, на входе ф-ий битмап.
А так будет JPEG в нужном какчестве:
Bitmap b = Bitmap.FromFile("a.jpg");
EncoderParameters ep = new EncoderParameters(1);
ImageCodecInfo icJPG = getCodecInfo("image/jpeg");
// jpeg quality
ep.Param[0] = new EncoderParameter(Encoder.Quality, (long) 80);
b.Save("b.jpg", icJPG, ep);
|