2011-01-19 3 views
0

実験のための刺激を生成する私のongoing questの一部として、私は奇妙な問題を抱えています。イメージのどのようなプロパティによってサイジングの問題が発生する可能性がありますか?

今度は、イメージを同じサイズのセグメントに分割し、これらをランダムにスワップすることによってイメージをシャッフルします。これは最初のテストでうまくいき、すぐにプログラムを忘れてしまった。私の同僚が彼女のイメージでそれを試してみると、セグメントは突然小さくなるようになりました。

問題を説明するために、私は斜線ブラシで各セグメントの長方形を充填しました:

A series of experimental images

画像対Aが(フェイスブックからダウンロード)テスト画像から私の初期の結果を示しています。イメージペアBは、同僚のテストイメージに適用された同じ操作を示しています。ハッチングされた領域にはそれらの間にギャップがあることに注意してください。第3のイメージペアは、元のイメージをGIMPで変更して再保存した後も同じ効果を示します。 (元々オリエンテーションが効果を持っているかどうかを確認するためにこれをやったのですが)。

GIMPからイメージをエクスポートするプロセスは、イメージの一部のプロパティに影響を与え、ディメンションが正しく解釈されなかったようです。これを検出して修正できる方法はありますか?


私のコード(あなたの正気のために編集):

this.original = Image.FromFile(this.filename); 
Image wholeImage = (Image)this.original.Clone(); 

int segwidth = (int)Math.Floor((double)(this.original.Width/segsX)); 
int segheight = (int)Math.Floor((double)(this.original.Height/segsY)); 

int segsCount = segsX * segsY; 
Image[] segments = new Image[segsCount]; 

for (i = 0; i < segsCount; i++) 
{ 
    x = (i % segsX); 
    y = (int)Math.Floor((double)(i/segsX)); 
    segments[i] = Crop(wholeImage, new Rectangle(x * segwidth, y * segheight, segwidth, segheight), (i%2>0)); 
} 

// Call to an array shuffling helper class 

using (Graphics g = Graphics.FromImage(wholeImage)) 
{ 
    for (j = 0; j < segsCount; j++) 
    { 
     x = (j % segsX); 
     y = (int)Math.Floor((double)(j/segsX)); 
     insertPoint = new Point(x * segwidth, y * segheight); 
     g.DrawImage(segments[j], insertPoint); 
    } 
} 

wholeImage.Save(this.targetfolder + Path.DirectorySeparatorChar + aggr_filename, ImageFormat.Png); 

// The cropping function (including the hatch generation, which would be commented out when no longer needed) 
static private Image Crop(Image wholeImage, Rectangle cropArea, Boolean odd = true) 
{ 
    Bitmap cropped = new Bitmap(cropArea.Width, cropArea.Height); 
    Rectangle rect = new Rectangle(0, 0, cropArea.Width, cropArea.Height); 
    System.Drawing.Drawing2D.HatchBrush brush; 
    if (odd) 
    { 
     brush = new System.Drawing.Drawing2D.HatchBrush(System.Drawing.Drawing2D.HatchStyle.Plaid, Color.Red, Color.Blue); 
    } 
    else 
    { 
     brush = new System.Drawing.Drawing2D.HatchBrush(System.Drawing.Drawing2D.HatchStyle.Plaid, Color.Beige, Color.CadetBlue); 
    } 
    using(Graphics g = Graphics.FromImage(cropped)) 
    { 
     g.DrawImage(wholeImage, rect, cropArea, GraphicsUnit.Pixel); 
     g.FillRectangle(brush, rect); 
    } 
    return cropped as Image; 
} 
+0

(this.original = Image.FromFile(this.filename))を使用してください。 。}の画像スタンス。これで問題は解決しませんが、それ以外の場合はメモリリークが発生します。 – CaptainPlanet

+0

ああ、ありがとうCaptainPlanet!まだC#ネイティブではありません:) –

答えて

1

はちょうどそれの一体のためOP--

の要求に応じて答えとして--added、私はPHPにこれを移植し、あなたが側に(余白ではなく、個々のタイルの周りの余白期待するとして、それは動作します。しかし、これは私には、固定ピクセル寸法ではなく表示デバイスのdpiに基づいて分離画像をレンダリングすると思われるdrawimage(image、point)のmsdnページに私をもたらしました。イメージ再構成のクロップ関数で使用したdrawimageメソッドを使用してみてください。

0

あり、それによりかもしれないが、私は画像サイズの場合、余分なピクセルを処理するためのメカニズムを気付きませんでしたセグメントサイズによって均等に割り切れるわけではありません。あなたのテストケースはすべて完璧なものでしたか?

は、100×100画像、10個のセグメントを想定:100/10の

フロア= 10。 10×10 = 100ピクセル。

は、100×100画像、13個のセグメントと仮定:13分の100 = 7の

床と、 13×7 = 91ピクセル。

+0

これは適切に処理されていないことは事実ですが、それは別の効果があります。画像ペアAには、不正確なフィットによって右端と下端にハッチングのないマージンがあることがわかります。しかし、提案をありがとう。 :) –

+0

原点を計算するために必要なセグメント数(segX)を使用して余白があなたから来ていると思います。おそらく、タイルの幅(私の例では7px)を使用するべきであり、異なる行になる最後の行/列の特殊なケースを追加する必要があります。 – horatio

+0

ちょうどそれの地獄のために、私はこれをPHPに移植し、あなたが期待するように動作します(側面の余白、個々のタイルの周りの余白ではありませんが、これはdrawimage(画像、ポイント)あなたのクロップ関数はrectを使用し、ピクセル単位の測定値を指定しますが、再描画ルーチンは別の方法を使用します。あなたは画像再構成のクロップ関数で使用しました – horatio

関連する問題