2012-10-04 81 views
0

我在切割圖像時遇到問題。用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)。不過那可以。

問題是,第二個不會是圖像,但它是黑色的。

回答

2

問題是,您正在將繪製的圖像向右移動而不是向左移動。你會被完全繪製源圖像的新形象外:

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

使用負座標:

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

在一個側面說明;您將圖像保存到內存流中,然後從內存流中加載它並將其保存到文件中。只需將其直接保存到文件即可。

+0

沒有成功,第二張圖像在這裏仍然是黑色。我懷疑矩形或gDrawImage有問題;我將在明天進行調查。 對你的邊節點的評論:如果我直接保存我,c#會拋出一個內存不足異常。這種記憶流的東西可以提高性能,並且可以處理更大的文件。 –

+0

@TonyB:我明白了,您還在使用「DrawImage」的重載來縮放圖像。使用此重載,而不是隻使用圖像和目標座標:http://msdn.microsoft.com/en-us/library/558kfzex.aspx – Guffa

+0

仍然無法正常工作。現在圖像將被縮放,第二張圖像會再次變黑。 –

0

好了,解決的辦法是:使用原來的代碼,但是這是錯誤的,所以不是使用:

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

它的正確使用方法:

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

X在座標系代表寬度,我只是在這裏犯了一個小的X/Y錯誤。現在它工作。