急,求C#合成图方法,本人方法生产出来图片太大

worm128 2010-01-04 09:54:46
高清:
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++写的,不知道效果是否显著
...全文
465 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
snoopyxl 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liuwl03 的回复:]

楼主不厚道,解决了也不贴出解决方案!
[/Quote]

给我讲一讲嘛!
liuwl03 2010-09-25
  • 打赏
  • 举报
回复
楼主不厚道,解决了也不贴出解决方案!
xmin 2010-01-09
  • 打赏
  • 举报
回复
貌似不简单
worm128 2010-01-09
  • 打赏
  • 举报
回复
合成图已经解决,主题频道官网公测版:http://theme.3g.cn 【全新主题改版抢先体验】
wyman25 2010-01-05
  • 打赏
  • 举报
回复
顶下虫兄。
试下换其他格式,可能gif格式的文件大小会小点。
还有颜色质量等等。
出来图片的尺寸,还有其他因素影响文件大小。
代码没试过,建议尝试下设置颜色的模式.net中drawing的画板中不知道有没有相关属性。
worm128 2010-01-04
  • 打赏
  • 举报
回复
以下图片展示
8k
16k
64k

普通,高清,完全高清
worm128 2010-01-04
  • 打赏
  • 举报
回复
现在用Graphics 来合成图片就是不好,换一个方法
wallier 2010-01-04
  • 打赏
  • 举报
回复
这个好不

/// <summary>
/// 合并图片
/// </summary>
/// <param name="bitMapDic"></param>
/// <returns></returns>
private Bitmap MergerImg(Dictionary<string, Bitmap> bitMapDic)
{
if (bitMapDic == null || bitMapDic.Count == 0)
throw new Exception("图片数不能够为0");
//创建要显示的图片对象,根据参数的个数设置宽度
Bitmap backgroudImg = new Bitmap(bitMapDic.Count * 12, 16);
Graphics g = Graphics.FromImage(backgroudImg);

//清除画布,背景设置为白色
g.Clear(System.Drawing.Color.White);

int j = 0;
foreach (KeyValuePair<string, Bitmap> entry in bitMapDic)
{
Bitmap map = entry.Value;
g.DrawImage(map, j * 11, 0, map.Width, map.Height);
j++;
}
g.Dispose();
return backgroudImg;
}
worm128 2010-01-04
  • 打赏
  • 举报
回复
wuyq11,现在我合成出来的图片容量大,质量差,而且质量要不8k,要不16k,刚好翻倍,很奇怪,如何解决?
方法一样的,都是通过Graphics 来draw 合成图片

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧