我在切割圖像時遇到問題。用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:\usr\test\" + fileName);
}
}
這是我的代碼片段。 目前我正在使用圖像化5906 * 1773進行測試。每個切割圖像的切片尺寸應爲2096 * 1773.因此,上面的代碼會忽略寬度爲1714的其餘部分(2096 * 2 = 4192,其餘爲5906 - 4192 = 1714)。不過那可以。
問題是,第二個不會是圖像,但它是黑色的。
沒有成功,第二張圖像在這裏仍然是黑色。我懷疑矩形或gDrawImage有問題;我將在明天進行調查。 對你的邊節點的評論:如果我直接保存我,c#會拋出一個內存不足異常。這種記憶流的東西可以提高性能,並且可以處理更大的文件。 –
@TonyB:我明白了,您還在使用「DrawImage」的重載來縮放圖像。使用此重載,而不是隻使用圖像和目標座標:http://msdn.microsoft.com/en-us/library/558kfzex.aspx – Guffa
仍然無法正常工作。現在圖像將被縮放,第二張圖像會再次變黑。 –