使用 c#、内存流、图形和图像剪切图像



>我在剪切图像时遇到问题。

我想做的是,将图像切成一些切片,主要是二次切片。代码尚未针对边界值进行优化,并且不应以适当的大小剪切整个图像,但目前这不是问题。

我的问题是,被剪切的第一个图像实际上是原始图像的一部分,但第二个图像(或之后的所有图像)只是黑色的。 我只是在死胡同里,我不知道问题是什么。

            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:usrtest" + fileName);
                    }
                }

这是我的代码片段。目前,我正在以图像大小5906 * 1773对其进行测试。每个剪切图像的切片尺寸应为 2096 * 1773。因此,上面的代码忽略了宽度上 1714 的其余部分(2096 * 2 = 4192,其余的 5906 - 4192 = 1714)。不过,没关系。

问题是,第二个不会是图像,但它是黑色的。

问题是您正在向右和向下移动绘制的图像,而不是向左和向上移动。您将在新图像之外完全绘制源图像:

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

使用负坐标:

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

附带说明一下;您将图像保存到内存流,然后从内存流加载它并将其保存到文件中。只需将其直接保存到文件中即可。

好的,解决方案是: 使用原始代码,但这是错误的,所以不使用:

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

正确使用:

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

坐标系处的 X 代表宽度,我只是在这里犯了一个小的 X/Y 错误。 现在它工作了。

相关内容

  • 没有找到相关文章

最新更新