图片放大失真问题

Lidew 2015-01-17 09:34:35
如题,一个像素的纯色图片放大50倍,颜色从左上角开始逐渐变浅,代码如下:
			Bitmap bmp = Bitmap.FromFile("D:\\test.png") as Bitmap;
Bitmap newBitmap = new Bitmap(50, 50);
Graphics g = Graphics.FromImage(newBitmap);
g.DrawImage(bmp, new Rectangle(0, 0, 50, 50), new Rectangle(0, 0, 1, 1), GraphicsUnit.Pixel);
newBitmap.Save("D:\\newTest.png");
g.Dispose();
newBitmap.Dispose();
bmp.Dispose();
...全文
352 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
assky124 2015-01-19
  • 打赏
  • 举报
回复


            base.OnPaint(e);
            Bitmap bmp = new Bitmap(1,1);
            using(Graphics g = Graphics.FromImage(bmp))
            {
                g.Clear(Color.Red);
                //g.FillEllipse(Brushes.Black, new Rectangle(0, 0, 10, 10));
            }
            System.Drawing.Imaging.ImageAttributes attr = new System.Drawing.Imaging.ImageAttributes();
            attr.SetWrapMode(WrapMode.Tile);  //这个是关键
            e.Graphics.DrawImage(bmp,new Rectangle(0,0,50,100), 0,0,bmp.Width,bmp.Height,GraphicsUnit.Pixel, attr,null,IntPtr.Zero);


Lidew 2015-01-19
  • 打赏
  • 举报
回复
引用 13 楼 assky124 的回复:
你把绘图的抗锯齿关掉
也是一样的效果
assky124 2015-01-19
  • 打赏
  • 举报
回复
你把绘图的抗锯齿关掉
Lidew 2015-01-19
  • 打赏
  • 举报
回复
现在是用两个像素的图片放大替代了,放大两个像素的图片没有问题,只是想了解一下这个原因。
hz_shengsy 2015-01-19
  • 打赏
  • 举报
回复
图片足够大 应该就不会失真 了。要这张图片大,也就是像素高。
  • 打赏
  • 举报
回复
与其纠结于为啥放大N倍就有失真问题,为啥不考虑改变策略,提供不同比例的图片,按需取对应图片,因为图片失真这是没办法的事情,你还需要了解下图片失真跟图片保存方式之间的关系
Lidew 2015-01-19
  • 打赏
  • 举报
回复
不行,放大一个像素的图片还是一样会出现颜色逐渐变淡的问题。
於黾 2015-01-19
  • 打赏
  • 举报
回复
你想"放大"后不失真,应该自己获取它的颜色然后填充进新的图像里,而不是直接调用系统函数让它自己"放大"
daxiang_2678047067 2015-01-18
  • 打赏
  • 举报
回复
如何生成高清略缩图不失真 //上传图片 protected void imgBtnLoad_Click(object sender, ImageClickEventArgs e) { if (!fulPhoto.HasFile) { lbMessage.Text = "请选择上传图片!"; return; } else { try { //获取上传文件路径 string filePath = fulPhoto.PostedFile.FileName; //获取上传文件后缀 string fileExt = filePath.Substring(filePath.LastIndexOf(".") + 1); //限定上传格式 if (fileExt.ToLower() == "gif" || fileExt.ToLower() == "jpg" || fileExt.ToLower() == "bmp" || fileExt.ToLower() == "png") { if (fulPhoto.PostedFile.ContentLength > 5120000) { lbMessage.Text = "限定上传图片的大小不能超出5M!"; return; } else { //根据时间生成文件名 string nowTime = Album.CreateDateTimeString(); string fileName = nowTime + "." + fileExt; //源文件保存路径 string savePath = Server.MapPath("UpFile/"); //缩略图保存路径 string imgPath = Server.MapPath("UpSmall/"); //上传图片 fulPhoto.PostedFile.SaveAs(savePath + fileName); //创建自定义Album类对象实例 Album am = new Album(); //根据图片的宽、高比例生成缩略图 System.Drawing.Image img = System.Drawing.Image.FromFile(savePath + fileName); if (img.Width >= img.Height) { am.GetThumbnail(savePath + fileName, imgPath + fileName, 400, 300, "Cut"); } else { am.GetThumbnail(savePath + fileName, imgPath + fileName, 320, 350, "Cut"); } //文件类型 string p_type = fulPhoto.PostedFile.ContentType; //文件大小 int p_size = fulPhoto.PostedFile.ContentLength; int categoryId = Convert.ToInt32(ddlCategory.SelectedValue); //调用类方法将数据插入到数据库 int result = am.AddPhoto(tbName.Text.Trim(), tbDescript.Text.Trim(), fileName, p_type, p_size, categoryId); ScriptManager.RegisterStartupScript(UpdatePanel1, typeof(UpdatePanel), "scriptname", "alert('图片上传成功!!');", true); } } else { lbMessage.Text = "只允许上传gif,jpg,bmp,png格式的图片文件!"; return; } } catch (Exception ex) { throw new Exception(ex.Message, ex); } } }//codego.net/tags/11/1/ //调用自定义方法生成略缩图 public void GetThumbnail(string serverImagePath, string thumbnailImagePath, int width, int height, string p) { System.Drawing.Image serverImage = System.Drawing.Image.FromFile(serverImagePath); //画板大小 int towidth = width; int toheight = height; //缩略图矩形框的像素点 int x = 0; int y = 0; int ow = serverImage.Width; int oh = serverImage.Height; switch (p) { case "WH"://指定高宽缩放(可能变形) break; case "W"://指定宽,高按比例 toheight = serverImage.Height * width / serverImage.Width; break; case "H"://指定高,宽按比例 towidth = serverImage.Width * height / serverImage.Height; break; case "Cut"://指定高宽裁减(不变形) if ((double)serverImage.Width / (double)serverImage.Height > (double)towidth / (double)toheight) { oh = serverImage.Height; ow = serverImage.Height * towidth / toheight; y = 0; x = (serverImage.Width - ow) / 2; } else { ow = serverImage.Width; oh = serverImage.Width * height / towidth; x = 0; y = (serverImage.Height - oh) / 2; } break; default: break; } //新建一个bmp图片 System.Drawing.Image bm = new System.Drawing.Bitmap(towidth, toheight); //新建一个画板 System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bm); //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(System.Drawing.Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(serverImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel); try { //以jpg格式保存缩略图 bm.Save(thumbnailImagePath, System.Drawing.Imaging.ImageFormat.Jpeg); } catch (System.Exception e) { throw e; } finally { serverImage.Dispose(); bm.Dispose(); g.Dispose(); } }
Lidew 2015-01-17
  • 打赏
  • 举报
回复
我期望是1*1的黑色图片,放大为一个50*50像素的黑色图片,但是现在出现的结果是从左上角开始逐渐变淡的图片,如果我用2*2的黑色的图片,就没有这个问题,这是什么原因
  • 打赏
  • 举报
回复
准确地说出你给出的测试数据的所谓“不失真”的具体数值来,不要拿几行代码就让别人来猜你所谓的“不失真”的概念。 写出具体数据来说明!
  • 打赏
  • 举报
回复
图片放大了,没有丢失任何信息,你偏说人家“失真”了,谁知道你想怎样呢? 你用一个自然的(而非技术)的语言说一下你的期望的结果,说说看如何补充你认为缺少的图像,看看靠谱不?
Lidew 2015-01-17
  • 打赏
  • 举报
回复
但是图片是两个像素的就没有问题,也是一样的代码缩放,这是什么原因呢?
willhuo 2015-01-17
  • 打赏
  • 举报
回复
额,我碰到了同样的问题。。。 例如我放到的是文字,格式是bitmap图像格式。。如果放到的话,文字会变得模糊,就是不知道怎么放大了以后不失真,保持原样的形状
本拉灯 2015-01-17
  • 打赏
  • 举报
回复
图片放大了肯定失真呀,哪有不失真的图。缩小也会失真。

110,502

社区成员

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

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

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