実験のための刺激を生成する私のongoing questの一部として、私は奇妙な問題を抱えています。イメージのどのようなプロパティによってサイジングの問題が発生する可能性がありますか?
今度は、イメージを同じサイズのセグメントに分割し、これらをランダムにスワップすることによってイメージをシャッフルします。これは最初のテストでうまくいき、すぐにプログラムを忘れてしまった。私の同僚が彼女のイメージでそれを試してみると、セグメントは突然小さくなるようになりました。
問題を説明するために、私は斜線ブラシで各セグメントの長方形を充填しました:
画像対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;
}
(this.original = Image.FromFile(this.filename))を使用してください。 。}の画像スタンス。これで問題は解決しませんが、それ以外の場合はメモリリークが発生します。 – CaptainPlanet
ああ、ありがとうCaptainPlanet!まだC#ネイティブではありません:) –