高清:

32k

16k
普通:

8k
我要做两种图,一种是普通图,一种是高清图,普通图控制在8k内,高清在16k内
如图,这是合成出来的图片,但是合成出来有些是16k,有些事32k,不知道为什么容量会翻倍
而且普通图很模糊,调了很久,就是容量大小不行
本人的合成步骤:
1.是先缩略左右两张图
2.再把图片合成到背景图
3.缩略整张图片大小
4.图片通过内存流输出
本人觉得是在合成背景图的时候把图片的容量撑大了~~
合成方法:
/// <summary>
/// 图片合成,这个会生成一个小边框,可选择合成图片的质量
/// </summary>
/// <param name="bitmap1">下面图</param>
/// <param name="bitmap2">上面图</param>
/// <param name="StartX">上面图在下面图中左上角点的横坐标</param>
/// <param name="StartY">上面图在下面图中左上角点的纵坐标</param>
/// <param name="quality">生成图的质量,1为普通,2为高清</param>
/// <returns></returns>
public Bitmap Compose(Bitmap bitmap1, Bitmap bitmap2, int StartX, int StartY, int quality)
{
Bitmap bmp = new Bitmap(bitmap1.Width, bitmap1.Height, PixelFormat.Format24bppRgb);
Graphics g2 = Graphics.FromImage(bmp);
Graphics g = Graphics.FromImage(bmp);
if (quality == 1)
{
g.CompositingQuality = CompositingQuality.HighSpeed;
//g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.Low;
g2.CompositingQuality = CompositingQuality.HighSpeed;
g2.InterpolationMode = InterpolationMode.Low;
}
else if (quality == 2)
{
g.CompositingQuality = CompositingQuality.HighQuality;
//g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g2.CompositingQuality = CompositingQuality.HighQuality;
g2.InterpolationMode = InterpolationMode.HighQualityBicubic;
}
g2.DrawImage(bitmap1, 0, 0, bmp.Width, bmp.Height);
g2.Dispose();
g.DrawImage(bitmap2, StartX, StartY);
g.Dispose();
return bmp;
}
生成最终图片时候,调节图片质量:
//图片质量设置
EncoderParameter imgParm;
ImageCodecInfo info = this.GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters imgQuality = new EncoderParameters(1);
if (quality == 2)
imgParm = new EncoderParameter(encoder, 80L);
else
imgParm = new EncoderParameter(encoder, 30L);
imgQuality.Param[0] = imgParm;
//输出内存流
if (shellCompBmp != null)
shellCompBmp.Save(memoryStream, info, imgQuality);
imgParm.Dispose();
imgQuality.Dispose();
Response.ContentType = "image/jpeg";
Response.BinaryWrite(memoryStream.GetBuffer());
一上基本是两个比较重要的地方,望高手指点~~
是不是.net本身的方法不行,我看网上有人用 MagickNet 的第三方组件,是用C++写的,不知道效果是否显著