GDI+でリフレクション効果を生成する方法
上のスクリーンショットのような、リフレクション効果を得るコードをGDI+で(現実逃避をかねて)書いてみました。Per-pixelアルファブレンドを行うので、どんな背景がきても綺麗にリフレクション効果を得ることが出来ます。
WPFとかでは、OpacityMaskを使うと一瞬で出来てしまいますが...
本質的なコードを抜粋すると...
リフレクション効果を得たいイメージを描画して、
g.DrawImage(bitmap, new Rectangle(0, 0, reflectedBitmap.Width, reflectedBitmap.Height), new Rectangle(0, bitmap.Height - reflectionHeight, reflectionWidth, reflectionHeight), GraphicsUnit.Pixel);
ひっくり返して、
reflectedBitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
アンセーフブロック内で、線形でアルファ値をいじるだけ!
byte* ptr = (byte*)bitmapData.Scan0.ToPointer(); for (int y = 0; y < reflectionHeight; y++) { for (int x = 0; x < reflectionWidth; x++) { byte* pos = (byte*)(ptr + bitmapData.Stride * y + x * bitmapData.Stride / bitmapData.Width); double alpha = *(pos + 3); *(pos + 3) = (byte)((alpha * (int)(Byte.MaxValue - Byte.MaxValue * y / reflectionHeight) / Byte.MaxValue) * opacity); } }
ちなみに、reflectedBitmapは、Bitmap型でPixelFormat.Format32bppArgbを指定して生成してます。