急,求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++写的,不知道效果是否显著
...全文
528 10 打赏 收藏 举报
写回复
用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 合成图片
附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[坡道(ramp)] · 训练集:275 张 · 验证集:27 张 · 测试集:0 张 · 总计:302 张 该数据集聚焦于城市环境中各类建筑入口处的坡道设施,涵盖住宅、商铺、公共设施等多种场景,真实反映了无障碍通行设施在实际应用中的多样化形态。数据集中包含金属、橡胶、塑料等多种材质的坡道,以及不同尺寸、结构和安装方式的实例,充分体现了坡道在城市基础设施中的广泛部署与重要性。该数据集为城市智慧化管理、无障碍环境建设及公共安全监控提供了高质量的视觉基础支持。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 33 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.6372** mAP50-95 | 0.3401 Precision | 0.6603 Recall | 0.6190 train/box_loss | 1.0569 train/cls_loss | 0.7307 val/box_loss | 1.6084 val/cls_loss | 1.9323 【训练过程分析】 33 轮训练后 mAP50 仅 0.6372,模型收敛不充分。Loss 曲线前期下降后进入平台期,mAP 提升缓慢。mAP50-95 为 0.3401,定位精度同样偏低。 【模型性能评估】 Precision 0.6603、Recall 0.6190,精度高于召回,存在一... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

111,128

社区成员

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

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

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