1

画像の切り取りに問題があります。

私がやりたいのは、画像をいくつかのスライスにカットすることです。ほとんどが2次式です。コードはまだ境界値用に改良されておらず、画像全体を適切なサイズにカットするべきではありませんが、それは現在問題ではありません。

私の問題は、カットされた最初の画像は実際には元の画像の一部ですが、2番目の画像(またはその後のすべて)は黒だけであるということです。私は行き止まりになっていて、何が問題なのかわかりません。

            var sourceImg = System.Drawing.Image.FromFile(args[numcount]);

                int cutsizeHeight = sourceImg.Height < cutsize ? sourceImg.Height : cutsize;
                int cutsizeWidht = sourceImg.Width < cutsize ? sourceImg.Width : cutsize;

                int cutPassesHeight = (int)(sourceImg.Height / cutsize) == 0 ? 1 : (int)(sourceImg.Height / cutsize);
                int cutPassesWidth = (int)(sourceImg.Width / cutsize) == 0 ? 1 : (int)(sourceImg.Width / cutsize);

                for (int i = 0; i < cutPassesHeight; i++)
                {
                    for (int j = 0; j < cutPassesWidth; j++)
                    {
                        var mem = new MemoryStream();
                        var sourcePositionX = i * cutsizeHeight;
                        var sourcePositionY = j * cutsizeWidht;
                        var cutRectangle = new System.Drawing.Rectangle(0, 0, cutsizeWidht, cutsizeHeight);

                        var newImage = new Bitmap(cutRectangle.Width, cutRectangle.Height);
                        Graphics g = Graphics.FromImage(newImage);
                        g.DrawImage(sourceImg, cutRectangle, sourcePositionX, sourcePositionY, cutsizeWidht, cutsizeHeight, GraphicsUnit.Pixel);
                        newImage.Save(mem, ImageFormat.Png);

                        var saveImage = System.Drawing.Image.FromStream(mem);
                        var fileName = System.IO.Path.GetFileName(args[numcount]);
                        var pureName = fileName.Split('.');
                        fileName = pureName[0] + i.ToString() + "_" + j.ToString() + ".png";
                        saveImage.Save(@"C:\usr\test\" + fileName);
                    }
                }

これは私のコードスニペットです。現在、画像サイズ5906*1773でテストしています。カットされた画像あたりのスライスサイズは2096*1773である必要があります。したがって、上記のコードは、幅の残りの1714(2096 * 2 = 4192、残りの5906-4192 = 1714)を無視します。 )。しかし、それは大丈夫です。

問題は、2番目の画像は画像ではなく、黒であるということです。

4

2 に答える 2

2

問題は、描画した画像を左と上ではなく右と下に移動していることです。ソース画像を完全に新しい画像の外に描画します。

First image:  Second image:     Third image:
+---+----+    +---+--------+    +---+    +--------+
| d |    |    | d |        |    | d |    |        |
+---+    |    +---+    s   |    +---+    |    s   |
|     s  |        |        |             |        |
+--------+        +--------+             +--------+

負の座標を使用する:

var sourcePositionX = -i * cutsizeHeight;
var sourcePositionY = -j * cutsizeWidht;

余談ですが; 画像をメモリ ストリームに保存している場合は、メモリ ストリームから画像を読み込んでファイルに保存します。ファイルに直接保存するだけです。

于 2012-10-04T15:32:53.100 に答える
0

さて、解決策は次のとおりです。元のコードを使用しますが、これは間違っていたので、代わりに次を使用します。

var sourcePositionX = i * cutsizeHeight;
var sourcePositionY = j * cutsizeWidht;

使用するのは正しいです:

var sourcePositionY = i * cutsizeHeight;
var sourcePositionX = j * cutsizeWidht;

座標系の X は幅を表します。ここで X/Y の小さな間違いを犯しました。今では動作します。

于 2012-10-05T13:27:08.783 に答える