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 );

私が持っているのは、2番目のファイルのファイルサイズが異なることです(最初のファイルよりも大きい場合と小さい場合があります)。

エンコーディングに何か問題があると思いますが、正確には何がわかりません。何を変更または追加する必要がありますか?

PS Bitmap.Clone(...)は私が必要とすることをしません。

アップデート:

わかりました、私の実際のタスクは次のとおりです。

  1. ファイルをいくつかの小さな部分にカットします。

  2. パーツをディスクに保存します。

  3. ディスクからパーツを読み取ります。

  4. パーツを組み立てて完全な画像に戻します。

  5. フルイメージをディスクに保存します。

最初のファイルはPNG、最後のファイルはPNGです。パーツが変更されていない場合は、同じサイズである必要があります。

サイズが異なることが重要です。ファイルによっては非常に大きく、差が2MBを超える場合があるためです。

UPDATE2:

最初の画像。コードを実行すると、ファイルのサイズが大きくなります。

最初の画像

4

2 に答える 2

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 に答える
0

これは、.NetPNGエンコーダーを制御できないことが原因だと思います。これは、結果ファイルで分割結合を再度実行することで確認できます。私のテストでは、ファイルサイズは2回目も同じままでした。2回目のテストは、Paint.Netを使用して、分割せずに自分のコードでロード/保存しました。 / combiningとこれにより、ファイルサイズも増加しました。急いで作成したスプリッター/コンバイナーで気付いたもう1つの点は、分割数が画像の幅の要因ではない場合の丸め誤差が原因で、結果が微妙に異なるファイルでした。これはもちろんファイルサイズに影響します。

同じファイルサイズを取得するためにできることは、ファイルが最初に作成されたときと同じエンコーダーを使用することだけだと思います。画像の作成方法によっては、これが可能かもしれませんが、おそらくこの増加にとらわれています。

注:上記のテストファイル(元々は103,191バイト)を使用すると、私の結果は121,715バイトでした

于 2012-10-19T14:41:22.760 に答える