我需要调整图像大小,但图像质量不受此影响,图像将从10x10到1000x1000,它会有一些主要的拥塞和一些空的时间 它必须向上和向下扩展“可能会失去一些图像质量。”没关系,但它必须至少,一切都有光栅图形确实 请不要使用库或其他外部二进制文件
答案 0 :(得分:4)
以下是显示如何调整图片大小的链接:
答案 1 :(得分:0)
无论何时调整图像大小,都会导致某些质量下降 - 没有办法解决问题,但您可以通过在图形上下文中使用最高质量的选项来帮助最小化它。 / p>
这是我使用普通GDI +函数的方法:
public static Bitmap ResizeImage(Bitmap bmp, int width, int height,
InterpolationMode mode = InterpolationMode.HighQualityBicubic)
{
Bitmap bmpOut = null;
try
{
decimal ratio;
int newWidth = 0;
int newHeight = 0;
// If the image is smaller than a thumbnail just return original size
if (bmp.Width < width && bmp.Height < height)
{
newWidth = bmp.Width;
newHeight = bmp.Height;
}
else
{
if (bmp.Width == bmp.Height)
{
if (height > width)
{
newHeight = height;
newWidth = height;
}
else
{
newHeight = width;
newWidth = width;
}
}
else if (bmp.Width >= bmp.Height)
{
ratio = (decimal) width/bmp.Width;
newWidth = width;
decimal lnTemp = bmp.Height*ratio;
newHeight = (int) lnTemp;
}
else
{
ratio = (decimal) height/bmp.Height;
newHeight = height;
decimal lnTemp = bmp.Width*ratio;
newWidth = (int) lnTemp;
}
}
//bmpOut = new Bitmap(bmp, new Size( newWidth, newHeight));
bmpOut = new Bitmap(newWidth, newHeight);
bmpOut.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
Graphics g = Graphics.FromImage(bmpOut);
g.InterpolationMode = mode;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.FillRectangle(Brushes.White, 0, 0, newWidth, newHeight);
g.DrawImage(bmp, 0, 0, newWidth, newHeight);
}
catch
{
return null;
}
return bmpOut;
}
将图像调整为宽度或高度中的最大值 - 您可以改变该算法以适应调整大小的需要。
如果您想使用文件,可以添加另一个包装上述代码的帮助程序:
public static bool ResizeImage(string filename, string outputFilename,
int width, int height,
InterpolationMode mode = InterpolationMode.HighQualityBicubic)
{
using (var bmpOut = ResizeImage(filename, width, height, mode) )
{
var imageFormat = GetImageFormatFromFilename(filename);
if (imageFormat == ImageFormat.Emf)
imageFormat = bmpOut.RawFormat;
bmpOut.Save(outputFilename, imageFormat);
}
return true;
}
GDI +通常不是高质量图像处理的最佳解决方案 - 它很不错但是如果您需要Web应用程序中的最高质量,更好性能和线程安全性,则需要查看其他选项。
Bertrand LeRoy在前一段时间有一篇关于Image Resizing的文章,它提供了一些使用核心.NET框架的替代方案。 http://weblogs.asp.net/bleroy/state-of-net-image-resizing-how-does-imageresizer-do
答案 2 :(得分:-2)
您需要的是图像可扩展。我建议使用XML格式来存储图像,因为XML具有很高的可扩展性。例如:
<Image Width="640" Height="480">
<Pixel X="0" Y="0">
<Red>20</Red>
<Green>80</Green>
<Blue>0</Blue>
<Alpha>255</Alpha>
</Pixel>
<Pixel X="1" Y="0">
...
如果你担心记忆,我打赌这会很好地压缩: - )。