如何通过drawImage复制图像

时间:2012-10-19 13:06:35

标签: c# image bitmap

我需要在磁盘上制作PNG图像的副本。事实上,我需要更复杂的思考,但这是其中的一部分。 所以,

我这样做:

Bitmap oldbmp = new Bitmap( filename );

Bitmap newbmp = new Bitmap(oldbmp.Size.Width, oldbmp.Size.Height, oldbmp.PixelFormat);

// if I don't do this, destination image looks bigger and clipped
newbmp1.SetResolution(oldbmp.HorizontalResolution, oldbmp.VerticalResolution);

Graphics graphics = Graphics.FromImage(newbmp);
graphics.DrawImageUnscaled(oldbmp,0,0);

newbmp.Save( filename2 );

我所拥有的是第二个文件具有不同的文件大小(有时更多,有时少于第一个)。

我猜编码有问题,但无法理解究竟是什么。我必须更改或添加什么?

P.S。 Bitmap.Clone(...)不能满足我的需要。

更新

好的,我的实际任务是:

  1. 将文件剪切为几个较小的部分。

  2. 将零件保存到磁盘。

  3. 从磁盘读取部件。

  4. 将部件组装回完整图像。

  5. 将完整图像保存到磁盘。

  6. 第一个文件是PNG,最后一个文件是PNG,如果零件没有更改,它们必须是相同的大小。

    不同的大小很重要,因为有些文件非常大,差异可能超过2 MB!

    UPDATE2:

    第一张图片。执行代码后,文件大小增加。

    The first image

2 个答案:

答案 0 :(得分:0)

        Bitmap source = new Bitmap("input.png");

        Rectangle rec = new Rectangle(0, 0, 80, 144);


        Bitmap[] parts = new Bitmap[10];

        for (int i = 0; i < 10; i++)
        {
            rec.Y = 144 * i;

            Bitmap b = (Bitmap)cropImage(source, rec);

            b.Save(String.Format("{0}.png", i), ImageFormat.Png);
            parts[i] = b;
        }

        Bitmap output = new Bitmap(source.Width, source.Height);
        Graphics g = Graphics.FromImage(output);

        for(int i=0; i<10; i++)
        {
            Bitmap b = parts[i];

            g.DrawImageUnscaled(b, new Point(0, i * 144));
        }

        output.MakeTransparent(Color.Transparent); // test if the image view don't changes, use this to reduce the overhead, in my test it reduced output size by 10 percent without changing the view

        output.Save("output.png", ImageFormat.Png);

答案 1 :(得分:0)

我认为这是由于缺乏对.Net PNG编码器的控制。您可以通过在结果文件上再次运行拆分组合来确认这一点,在我的测试中,文件大小在第二次保持不变,我做的第二个测试是使用Paint.Net加载/保存并在我自己的代码中没有拆分/组合,这也增加了文件大小。我在仓促构造的分离器/组合器中注意到的另一件事是由于舍入错误,如果分割的数量不是图像宽度的一个因素,结果会产生微妙的不同文件,这当然会影响文件大小。

我认为,为了获得相同的文件大小,您唯一能做的就是使用与最初构建的文件相同的编码器。根据你制作图像的方式,这可能是可能的,但很可能你会坚持这种增加。

注意:使用上面的测试文件(最初为103,191字节),我的结果是121,715字节