我需要在磁盘上制作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(...)不能满足我的需要。
更新
好的,我的实际任务是:
将文件剪切为几个较小的部分。
将零件保存到磁盘。
从磁盘读取部件。
将部件组装回完整图像。
将完整图像保存到磁盘。
第一个文件是PNG,最后一个文件是PNG,如果零件没有更改,它们必须是相同的大小。
不同的大小很重要,因为有些文件非常大,差异可能超过2 MB!
UPDATE2:
第一张图片。执行代码后,文件大小增加。
答案 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字节