タイルセット ジェネレーター (2 つの画像をブレンドする) を作成しようとしていますが、1 つのテクスチャ/画像をメインのテクスチャ/画像にオーバーラップさせたり、特定のポイントで何らかの方法でフェードアウトしたりするために必要な方法に行き詰まっています。 -または、これは自動的に実行できない(または実行すべきではない)ものですか?
緑のイメージがフェードアウトすると、青のイメージが緑のイメージの上にフェードインして、スムーズに移行します。すでに 2 つの画像がある場合、どうすればよいですか?
今は青い部分しか切り取れません。したがって、残っているのは緑だけです。オーバーレイを追加しようとすると、単に醜いだけで、アルファレベルを上げる必要があると思います(青は、右下隅に近づくほど青くなるはずです)。
私が見るべきものはありますか?
私の現在の方法:しかし、現在、これは1つのコーナーでのみ機能しますが、「すべての」コーナーで機能するはずです。何が原因なのか見当がつきません。
public static Bitmap GenerateTile(Bitmap bitmap, Bitmap copyFrom, int x, int y, int width, int height, Point[] cutoff)
{
if (bitmap.Size != copyFrom.Size)
throw new Exception("Invalid image size. Image sizes must match");
Bitmap bmap = new Bitmap(width, height);
Bitmap overlay = new Bitmap(width, height);
Point min, max;
float alpha;
// returns minimum x, y and maximum x, y
GetCorners(cutoff, out min, out max);
for (int bx = x; bx < (x + width); bx++)
{
for (int by = y; by < (y + height); by++)
{
if (!IsInPolygon2(cutoff, new Point(bx, by)))
{
bmap.SetPixel(bx, by, bitmap.GetPixel(bx, by));
}
else
{
alpha = ((float)((max.X - bx) + (max.Y - by)) / (float)((max.X - min.X) + (max.Y - min.Y)));
if (alpha >= 0 && alpha <= 0.5f)
{
bmap.SetPixel(bx, by, Color.FromArgb((int)((alpha / 0.5f) * 255f), bitmap.GetPixel(bx, by)));
overlay.SetPixel(bx, by, Color.FromArgb((int)(255f - ((alpha / 0.5f) * 255f)), copyFrom.GetPixel(bx, by)));
}
}
}
}
using (Graphics g = Graphics.FromImage(bmap))
{
g.DrawImageUnscaled(overlay, 0, 0);
}
return bmap;
}
私のメソッドは次の結果を返します (まだ良くありません):
// bottom right corner
points.Add(new Point(image.Width / 2, image.Height));
points.Add(new Point(image.Width, image.Height / 2));
points.Add(new Point(image.Width, image.Height));
points.Add(new Point(image.Width / 2, image.Height));
// rightside
points.Add(new Point(image.Width / 2, image.Height));
points.Add(new Point(image.Width, image.Height));
points.Add(new Point(image.Width, 0));
points.Add(new Point(image.Width / 2, 0));
points.Add(new Point(image.Width / 2, image.Height));