我是按整数放大图片,绝一个点,放大1倍是四个点,能清楚的看到锯齿的那种放大。
以下是我的代码,可惜效率太底了,我放大一张1920*1080的图片要10秒左右。
string strFileNameOld = "f:\\ddd1.png";
string strFileNameNew = "f:\\ddd2.png";
int w3, h3, iz;
Color myColor;
int i, j, i0, j0, i1, j1;
iz = 2;
Bitmap bmpTmp = (Bitmap)System.Drawing.Image.FromFile(strFileNameOld);
w3 = bmpTmp.Width;
h3 = bmpTmp.Height;
Bitmap bmpNew = new Bitmap(w3 * iz, h3 * iz);
Graphics g = Graphics.FromImage(bmpNew);
try
{
for (i = 0; i < w3; i++)
{
i0 = i * iz;
for (j = 0; j < h3; j++)
{
j0 = j * iz;
myColor = bmpTmp.GetPixel(i, j);
for (i1 = i0; i1 < i0 + iz; i1++)
{
for (j1 = j0; j1 < j0 + iz; j1++)
{
bmpNew.SetPixel(i1, j1, myColor);
}
}
}
}
}
catch
{ } bmpTmp.Dispose();
g.Dispose();
bmpNew.Save(strFileNameNew, System.Drawing.Imaging.ImageFormat.Bmp);

解决方案 »

  1.   

    我自己研究出了答案,此贴为散分贴,宣传我的如意工具箱和javascript专用开发工具,去www.3http.com下载吧。 string strFileNameOld = "f:\\ddd1.png";
    string strFileNameNew = "f:\\ddd3.png";
    Bitmap originBmp = (Bitmap)System.Drawing.Image.FromFile(strFileNameOld);
    int w = Convert.ToInt32(originBmp.Width * iSize);
    int h = Convert.ToInt32(originBmp.Height * iSize);
    Bitmap resizedBmp = new Bitmap(w, h);
    Graphics g = Graphics.FromImage(resizedBmp);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    //g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.Invalid;
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    g.DrawImage(originBmp, new Rectangle(0, 0, w, h), new Rectangle(0, 0, originBmp.Width, originBmp.Height), GraphicsUnit.Pixel);
    g.Dispose();
    originBmp.Dispose();
    resizedBmp.Save(strFileNameNew, System.Drawing.Imaging.ImageFormat.Bmp);
      

  2.   

    下载地址:http://3http.com/3/jsedit.rar
    javaScript编辑器,JS专用编辑工具,css的专用编辑器,免费绿色版,需要.net2.0才能运行。特色:
    1.左侧能列出javascript的函数列表和对应注释,适合修改很大的js文件。
    2.断电保护,如果突然因为断电蓝屏等情况,程序再次打开时,所有内容都会在上次修改中的状态,可能仅仅丢失最后二分钟的内容。
    3.能保存近半个月的记录,在程序的tempfile文件中,所以因为误修改,可以到此目录下去找历史文件。
    4.能列出css文件的项目列表,方便修改大css文件
    5.bat文件的语法高亮
    6.去掉了菜单栏行,选项卡行,工具栏行的空间占用,能显示更多的代码行数
    7.快速查寻,选中的文字向下查询
    8.内含一个工式计算器和网页配色工具
    9.能注释和取消注释,不用再一行行的前面加//或去掉//了
    10.自定义了两类js注释,方便把js中的函数,代码按功能划分
      

  3.   

    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    即使是这样,也不能保证每个锯齿点透明度都是255,从你第二次代码来说纯粹是依赖系统绘制,而系统放大绘制本来就是近似插值.建议通过lock成一个bimapdata手工进行插值以保证每个锯齿点都是纯值(透明度255).
      

  4.   


    你可以做个试验.将包含透明的PNG图片放大然后保存,再在PS中打开,通过放大N倍直到看到一个个像素格,然后就能发现其中的秘密了.不过你的需求不需要这么精确了.
      

  5.   

    锯齿点也不只是靠透明度为基准,透明度只是其中一个参考(A R G B)
    常常有这样的情况:
    在PS中画了一张图,背景已经设置纯色了,在程序中通过透明色抠去的时候,发现还有一些残留.就是这个原因.
      

  6.   

    悲惨哪,我又自己搞定了,加上下面这句就行
    g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
    继续宣传我的软件:如意工具箱,还有jsEdit,javascript专用编辑工具,能显示函数列表,适合修改大js文件
    下载地址在 http://www.3http.com
      

  7.   

    原来微软提供的Drawing命名空间中的内容还可以将图片进行缩放,Mark住。
      

  8.   

    工具完成了,大家提点意见,虽然这工具实际用不着,因为win已经提供了。
    介绍地址
    http://topic.csdn.net/u/20110314/11/9f3b0ada-abe5-4840-9df2-87b941b24ebe.html?27934
      

  9.   

    string strFileNameOld = "f:\\ddd1.png";
                string strFileNameNew = "f:\\ddd2.png";
                int w3, h3, iz;
                Color myColor;
                int i, j, i0, j0, i1, j1;
                iz = 2;
                Bitmap bmpTmp = (Bitmap)System.Drawing.Image.FromFile(strFileNameOld);
                w3 = bmpTmp.Width;
                h3 = bmpTmp.Height;
                Bitmap bmpNew = new Bitmap(w3 * iz, h3 * iz);
                Graphics g = Graphics.FromImage(bmpNew);
                try
                {
                    for (i = 0; i < w3; i++)
                    {
                        i0 = i * iz;
                        for (j = 0; j < h3; j++)
                        {
                            j0 = j * iz;
                            myColor = bmpTmp.GetPixel(i, j);
                            for (i1 = i0; i1 < i0 + iz; i1++)
                            {
                                for (j1 = j0; j1 < j0 + iz; j1++)
                                {
                                    bmpNew.SetPixel(i1, j1, myColor);
                                }
                            }
                        }
                    }
                }
                catch
                {            }            bmpTmp.Dispose();
                g.Dispose();
                bmpNew.Save(strFileNameNew, System.Drawing.Imaging.ImageFormat.Bmp);
    可以试试
      

  10.   

    一般要做网页上的图片放大的话。我会先将一张大图放在 img 标签内,再设置其高宽使其缩小。
    当要放大时,有脚本修改img 的高宽值!That's All!