我在切割图像方面遇到了问题。
我想要做的是,切割一些切片中的图像,大多数是二次的。 代码尚未针对边界值进行细化,并且不应该以合适的大小剪切整个图像,但这不是问题所在。
我的问题是,已切割的第一张图像实际上是原始图像的一部分,但第二张图像(或其后的所有图像)仅为黑色。我只是走到了尽头,我不知道问题是什么。
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);
}
}
这是我的代码段。 目前我正在使用imagesize 5906 * 1773测试它。每个切割图像的切片尺寸应该是2096 * 1773.上面的代码因此忽略了1714的其余部分的宽度(2096 * 2 = 4192,其余的5906 - 4192 = 1714 )。但那没关系。
问题是,第二个不是图像,而是黑色。
答案 0 :(得分:2)
问题是您正在向右和向下移动图像,而不是向左和向上移动。您将完全在新图像之外绘制源图像:
First image: Second image: Third image:
+---+----+ +---+--------+ +---+ +--------+
| d | | | d | | | d | | |
+---+ | +---+ s | +---+ | s |
| s | | | | |
+--------+ +--------+ +--------+
使用负坐标:
var sourcePositionX = -i * cutsizeHeight;
var sourcePositionY = -j * cutsizeWidht;
旁注;您将图像保存到内存流,然后从内存流加载它并将其保存到文件。只需将其直接保存到文件中即可。
答案 1 :(得分:0)
好的,解决方法是:使用原始代码,但这是错误的,所以不要使用:
var sourcePositionX = i * cutsizeHeight;
var sourcePositionY = j * cutsizeWidht;
使用正确:
var sourcePositionY = i * cutsizeHeight;
var sourcePositionX = j * cutsizeWidht;
坐标系处的X代表宽度,这里我只是犯了一个小的X / Y错误。现在它有效。