[急救!]C#图像缩放算法问题

jingkingsoft 2004-12-22 05:29:07
要求是这样的:
输入一个图片,获得转换成为指定大小的图片

我写的函数如下:
private System.Drawing.Bitmap ResizeBMP(System.Drawing.Bitmap source_bmp,int new_width,int new_height)
{
float x_rate=source_bmp.Width/new_width;
float y_rate=source_bmp.Height/new_height;
System.Drawing.Bitmap cache_bmps=new Bitmap(new_width,new_height,PixelFormat.Format24bppRgb);
for(int cy=0;cy<new_height;cy++)
{
for(int cx=0;cx<new_width;cx++)
{
cache_bmps.SetPixel(cx,cy,source_bmp.GetPixel((int)((cx+1)*x_rate-1),(int)((cy+1)*y_rate-1)));
}
}
return cache_bmps;
}

函数执行起来倒是没有问题
但是生成的图片总是只有原图片的一部分被选取
难道x_rate,y_rate太小了?请各位高手指教。
...全文
525 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaomaoy 2005-05-07
  • 打赏
  • 举报
回复
类似这样图片处理的操作经常要用到,如果把它做成一个控件就好啦!
正在学习中......
qqqqin 2005-04-22
  • 打赏
  • 举报
回复
学习, 学习!
有交流才有进步!
ycy589 2005-03-19
  • 打赏
  • 举报
回复
学习
songboemail 2005-03-19
  • 打赏
  • 举报
回复
我以前做的一个程序,修正一下,代码如下:
private Image m_objImage;
private void ShowPic(int intPicIndex,int intPicTotal)
{
if(intPicIndex > intPicTotal)
{
return;
}

//m_objImage为当前的图像流
int x = 0;
int y = m_objImage.Height;
int width = m_objImage.Width/3;
int height = m_objImage.Height;

this.picGrasp.Visible = false;
this.lblPic.Refresh();

//intPicIndex为当前需要显示的图像的第几部分,
//intPicTotal为需要分割图像的个数
x = (intPicIndex - 1) * m_objImage.Width/intPicTotal;

Graphics g = this.lblPic.CreateGraphics();
g.Clear(this.BackColor);

//设置源图片框
Rectangle sourceRect = new Rectangle(x,0,width,height);

//设置目标图片框
Rectangle targetRect = new Rectangle(0,0,
width,height);

g.DrawImage(m_objImage,targetRect,sourceRect,GraphicsUnit.Pixel);
g.Dispose();
}
大可山人 2005-02-25
  • 打赏
  • 举报
回复
如果是写图像输出组件的话,为什么一定要有窗口呢?你用绘图表面"Graphics"不就可以了吗?
jingkingsoft 2005-02-25
  • 打赏
  • 举报
回复
呵呵,johnsuna,其实关键在于我想写的是一个图像输出组件,没有window application的,我的目的就是获得图像(image)再存盘。draw当然试过,但是不知道没有窗口的话怎么做啊。
powbcom 2005-01-09
  • 打赏
  • 举报
回复
我也做过类似的缩放,跟你描述的差不多,我采用是double类型
yg1982 2005-01-09
  • 打赏
  • 举报
回复
mark
kong19 2004-12-23
  • 打赏
  • 举报
回复
mark
大可山人 2004-12-23
  • 打赏
  • 举报
回复
我的http://www.QQAA.net/download那个图片浏览器中批处理整个文件夹或选定文件的缩略图的处理方式就是根据这样写的,效率很高而且缩略图质量非常好。我见得许多文章都说GDI+的效率和质量都是顶瓜瓜的,但目前还有些人对它持怀疑态度。我曾比较过,使用普通缩放算法与GDI+的直接方法的效率和效果,得到的结论是GDI+都非常棒。
大可山人 2004-12-23
  • 打赏
  • 举报
回复
你们的办法真笨!
为什么非要这样做?直接使用graphics.DrawImage()函数不就可以了吗?
例如:
g.DrawImage(image,
new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), //你的新大小
new System.Drawing.Rectangle(0, 0, image.Width,image.Height),//你的原图大小
System.Drawing.GraphicsUnit.Pixel);
jingkingsoft 2004-12-23
  • 打赏
  • 举报
回复
已解决,C#的除法运算是根据操作数据的类型确定最终输出的类型的
改为
float x_rate=(float)source_bmp.Width/(float)new_width;
即可解决,否则得到的永远是整数。
结帖!
jingkingsoft 2004-12-23
  • 打赏
  • 举报
回复
再顶一下!
这个函数问题在于:本来是将原图片按比例采样的方式复制到新图片上实现图像缩放。
但是很奇怪的是新图片并没有完全显示出来
感觉是原图片被裁减了再缩放的一样。

严重期待高手指教。
egxsun 2004-12-22
  • 打赏
  • 举报
回复
up
jingkingsoft 2004-12-22
  • 打赏
  • 举报
回复
5555555555
没人答么,自己再顶一下。
jingkingsoft 2004-12-22
  • 打赏
  • 举报
回复
微软有GetThumbnailImage函数可以获得略缩图
但是失真太严重了,只好重写一个
感觉这个启示和图像并没有太大关系
只是一个数学问题
在线等待

110,561

社区成员

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

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

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