0

我需要在我的磁盘上制作一个 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 );

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

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

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

更新:

好的,我的实际任务是:

  1. 将文件切割成几个较小的部分。

  2. 将零件保存到磁盘。

  3. 从磁盘读取部分。

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

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

第一个文件是PNG,最后一个文件是PNG,如果部分未更改,它们必须具有相同的大小。

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

更新2:

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

第一张图片

4

2 回答 2

0

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

我认为获得相同文件大小的唯一方法是使用最初构建文件时使用的相同编码器。根据您生成图像的方式,这可能是可能的,但您很可能会被这种增加所困扰。

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

于 2012-10-19T14:41:22.760 回答
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);
于 2012-10-19T13:59:51.063 回答