Blur
1 2 3 4 5 | <Button Content="버튼1" Width="100" Height="50"> <Button.Effect> <BlurEffect Radius="10"/> </Button.Effect> </Button> | cs |
DropShadow
1 2 3 4 5 | <Button Content="버튼1" Width="100" Height="50" Click="btn01_Click"> <Button.Effect> <DropShadowEffect Color="Black" ShadowDepth="10" BlurRadius="15" Opacity="0.5" Direction="180"/> </Button.Effect> </Button> | cs |
그림자 위치, 방향을 잘 조절하면 네온효과도 가능.
ShaderEffect
WriteableBitmap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | WriteableBitmap wb = new WriteableBitmap(100, 100, 96, 96, PixelFormats.Bgra32, null); for (int x = 0; x < img.Height; x++) { for (int y = 0; y < img.Width; y++) { byte b = (byte)(x % 256); byte g = (byte)(y % 256); byte r = 0; byte a = 255; byte[] p = { b, g, r, a }; Int32Rect rect = new Int32Rect(x, y, 1, 1); wb.WritePixels(rect, p, 400, 0); } } img.Source = wb; | cs |
b,g,r,a 인 이유는 intel x86에서 바이트단위로 메모리에 저장할 때 역워드 저장방식이라 그럼.
저렇게 저장하면 읽을 땐 argb 로 읽힘.
WritePixels 의 400 은 width * bpp(rgba 니까 4) 의 결과임.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | BitmapImage bitmap = new BitmapImage(new Uri("../../../../Assets/Texture/렌탈여친.jpg", UriKind.Relative)); //WriteableBitmap wb = new WriteableBitmap((int)bitmap.Width, (int)bitmap.Height, 96, 96, PixelFormats.Bgra32, null); WriteableBitmap wb = new WriteableBitmap(bitmap); byte[] pixels = new byte[(int)wb.PixelWidth * (int)wb.PixelHeight * (int)wb.Format.BitsPerPixel / 8]; Int32Rect rect = new Int32Rect(0, 0, wb.PixelWidth, wb.PixelHeight); wb.CopyPixels(pixels, wb.PixelWidth * 4, 0); for(int y = 0; y < wb.PixelHeight; y++) for(int x = 0; x < wb.PixelWidth; x++) { int offset = (y * wb.PixelWidth + x) * 4; byte gray = (byte)((pixels[offset] + pixels[offset + 1] + pixels[offset + 2]) / 3); pixels[offset] = gray; pixels[offset + 1] = gray; pixels[offset + 2] = gray; } wb.WritePixels(rect, pixels, (int)wb.PixelWidth * 4, 0); img.Source = wb; | cs |
위는 흑백효과 코드.
wb.CopyPixel, wb.WritePixels 가 핵심.
댓글 없음:
댓글 쓰기