public static async Task <WriteableBitmap> FromFileAsync(StorageFile file) { var bitmap = default(WriteableBitmap); using (var strm = await file.OpenStreamForReadAsync()) { bitmap = await WriteableBitmapExtensions.FromStreamAsync(strm); } return(bitmap); }
/// <summary> /// パラメータ無しの画像処理をおこなう /// </summary> /// <param name="bmp">元になるWriteableBitmapオブジェクト</param> /// <param name="effector">処理させるIEffectオブジェクト</param> /// <returns>処理後のWriteableBitmapオブジェクト</returns> private static WriteableBitmap ProcessEffect(WriteableBitmap bmp, IEffect effector) { // WriteableBitmapのピクセルデータをバイト配列に変換する var srcPixels = bmp.GetPixels(); // パラメータ無しの画像処理をおこなう var dstPixels = effector.Effect(bmp.PixelWidth, bmp.PixelHeight, srcPixels); // バイト配列からピクセルを作成する return(WriteableBitmapExtensions.FromArray(bmp.PixelWidth, bmp.PixelHeight, dstPixels)); }
/// <summary> /// パラメータ無しの画像処理をおこなう /// </summary> /// <param name="bmp">元になるWriteableBitmapオブジェクト</param> /// <param name="effectors">処理させるIEffectオブジェクト配列</param> /// <returns>処理後のWriteableBitmapオブジェクト</returns> private static WriteableBitmap ProcessEffect(WriteableBitmap bmp, IEnumerable <IEffect> effectors) { var pixels = bmp.GetPixels(); var width = bmp.PixelWidth; var height = bmp.PixelHeight; foreach (var effector in effectors) { pixels = effector.Effect(width, height, pixels); } return(WriteableBitmapExtensions.FromArray(width, height, pixels)); }
/// <summary> /// IRandomAccessStreamストリームからWriteableBitmapオブジェクトを生成する /// </summary> /// <param name="stream">IRandomAccessStreamストリーム</param> /// <returns>WriteableBitmapオブジェクト</returns> public static async Task <WriteableBitmap> FromRandomAccessStreamAsync(IRandomAccessStream stream) { // ストリームからピクセルデータを読み込む var decoder = await BitmapDecoder.CreateAsync(stream); var transform = new BitmapTransform(); var pixelData = await decoder.GetPixelDataAsync(decoder.BitmapPixelFormat, decoder.BitmapAlphaMode, transform, ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb); var pixels = pixelData.DetachPixelData(); // ピクセルデータからWriteableBitmapオブジェクトを生成する return(WriteableBitmapExtensions.FromArray((int)decoder.OrientedPixelWidth, (int)decoder.OrientedPixelHeight, pixels)); }
/// <summary> /// 口径食風の処理をしたWriteableBitmapオブジェクトを返す /// </summary> /// <param name="bmp">元になるWriteableBitmapオブジェクト</param> /// <param name="vignetting">口径食の強さ(0.0~1.0 標準:1.0)</param> /// <returns>処理後のWriteableBitmapオブジェクト</returns> public static async Task <WriteableBitmap> EffectVignettingAsync(this WriteableBitmap bmp, double vignetting) { // クラスライブラリ内の画像をリソースを読み出す var maskBitmap = default(WriteableBitmap); using (var strm = GetResourceStream("Softbuild.Media.Images.vignetting_gradation.png")) { // StreamからWriteableBitmapを生成する maskBitmap = await WriteableBitmapExtensions.FromStreamAsync(strm); } // 元画像とサイズと合わせる var resizedBmp = maskBitmap.Resize(bmp.PixelWidth, bmp.PixelHeight); // 口径食による周辺光量の低下風の処理をしたビットマップを作成する return(ProcessEffect(bmp, new VignettingEffect(resizedBmp, vignetting))); }
/// <summary> /// 幕末写真風処理をしたWriteableBitmapオブジェクトを返す /// </summary> /// <param name="bmp">元になるWriteableBitmapオブジェクト</param> /// <returns>処理後のWriteableBitmapオブジェクト</returns> public static async Task <WriteableBitmap> EffectBakumatsuAsync(this WriteableBitmap bmp) { // クラスライブラリ内の画像をリソースを読み出す var maskBitmap = default(WriteableBitmap); using (var strm = GetResourceStream("Softbuild.Media.Images.bakumatsu.jpg")) { // StreamからWriteableBitmapを生成する maskBitmap = await WriteableBitmapExtensions.FromStreamAsync(strm); } // 元画像とサイズと合わせる var resizedBmp = maskBitmap.Resize(bmp.PixelWidth, bmp.PixelHeight); // 幕末画像を作成する return(ProcessEffect(bmp, new BakumatsuEffect(resizedBmp))); }
/// <summary> /// リサイズする /// </summary> /// <param name="bmp">WriteableBitmapオブジェクト</param> /// <param name="destWidth">変形後の幅</param> /// <param name="destHeight">変形後の高さ</param> /// <returns>リサイズ後のWriteableBitmapオブジェクト</returns> public static WriteableBitmap Resize(this WriteableBitmap bmp, int destWidth, int destHeight) { // 加工前のWriteableBitmapオブジェクトからピクセルデータ等を取得する var srcWidth = bmp.PixelWidth; var srcHeight = bmp.PixelHeight; if ((srcWidth == destWidth) && (srcHeight == destHeight)) { // リサイズする必要がないのでそのままビットマップを返す return(bmp); } var srcPixels = bmp.GetPixels(); int pixelCount = destWidth * destHeight; var destPixels = new byte[4 * pixelCount]; var xs = (float)srcWidth / destWidth; var ys = (float)srcHeight / destHeight; for (var y = 0; y < destHeight; y++) { for (var x = 0; x < destWidth; x++) { var index = (y * destWidth + x) * 4; var sx = x * xs; var sy = y * ys; var x0 = (int)sx; var y0 = (int)sy; var srcIndex = (y0 * srcWidth + x0) * 4; destPixels[index + 0] = srcPixels[srcIndex + 0]; destPixels[index + 1] = srcPixels[srcIndex + 1]; destPixels[index + 2] = srcPixels[srcIndex + 2]; destPixels[index + 3] = srcPixels[srcIndex + 3]; } } // ピクセルデータからWriteableBitmapオブジェクトを生成する return(WriteableBitmapExtensions.FromArray(destWidth, destHeight, destPixels)); }
/// <summary> /// 指定した複数の矩形を指定した色で塗りつぶす /// </summary> /// <param name="bmp"></param> /// <param name="drawRects"></param> /// <param name="color"></param> /// <returns></returns> public static WriteableBitmap DrawRect(this WriteableBitmap bmp, IEnumerable <Rect> drawRects, Color color) { var pixels = bmp.GetPixels(); foreach (var drawRect in drawRects) { for (int x = (int)drawRect.X; x < drawRect.X + drawRect.Width; x++) { for (int y = (int)drawRect.Y; y < drawRect.Y + drawRect.Height; y++) { int index = x * 4 + y * (bmp.PixelWidth * 4); pixels[index] = color.B; pixels[index + 1] = color.G; pixels[index + 2] = color.R; pixels[index + 3] = color.A; } } } return(WriteableBitmapExtensions.FromArray(bmp.PixelWidth, bmp.PixelHeight, pixels)); }
/// <summary> /// トイカメラ風処理をしたWriteableBitmapオブジェクトを返す /// </summary> /// <param name="bmp">元になるWriteableBitmapオブジェクト</param> /// <param name="contrast">コントラストの調整量(0.0~1.0 標準:0.5)</param> /// <param name="saturation">彩度の調整量(0.0~1.0 標準:0.5)</param> /// <param name="vignetting">口径食の強さの調整量(0.0~1.0 標準:1.0)</param> /// <returns>処理後のWriteableBitmapオブジェクト</returns> public static async Task <WriteableBitmap> EffectToycameraAsync(this WriteableBitmap bmp, double contrast, double saturation, double vignetting) { int width = bmp.PixelWidth; int height = bmp.PixelHeight; // クラスライブラリ内の画像をリソースを読み出す var maskBitmap = default(WriteableBitmap); using (var strm = GetResourceStream("Softbuild.Media.Images.vignetting_gradation.png")) { // StreamからWriteableBitmapを生成する maskBitmap = await WriteableBitmapExtensions.FromStreamAsync(strm); } // 元画像とサイズと合わせる var resizedBmp = maskBitmap.Resize(width, height); var effectors = new List <IEffect>(); effectors.Add(new ContrastEffect(contrast)); effectors.Add(new SaturationEffect(saturation)); effectors.Add(new VignettingEffect(resizedBmp, vignetting)); return(ProcessEffect(bmp, effectors)); }