0

特定の色に基づいて画像を作成する必要があります。色は異なり、出力画像のサイズも異なります。Bitmap を作成し、アプリの一時フォルダーに保存したいと考えています。どうすればいいですか?

私の最初の要件は、色のリストと、UI に色のサンプルを提供することでした。画像のサイズが可変の場合、検索ペインでの結果の提案など、特定のシナリオ向けに画像を作成できます。

4

1 に答える 1

0

これは簡単ではありません。しかし、すべてがこの 1 つのメソッドにまとめられており、使用することができます。お役に立てば幸いです。とにかく、指定された色とサイズに基づいてビットマップを作成するコードは次のとおりです。

private async System.Threading.Tasks.Task<Windows.Storage.StorageFile> CreateThumb(Windows.UI.Color color, Windows.Foundation.Size size)
{
    // create colored bitmap
    var _Bitmap = new Windows.UI.Xaml.Media.Imaging.WriteableBitmap((int)size.Width, (int)size.Height);
    byte[] _Pixels = new byte[4 * _Bitmap.PixelWidth * _Bitmap.PixelHeight];
    for (int i = 0; i < _Pixels.Length; i += 4)
    {
        _Pixels[i + 0] = color.B;
        _Pixels[i + 1] = color.G;
        _Pixels[i + 2] = color.R;
        _Pixels[i + 3] = color.A;
    }

    // update bitmap data
    // using System.Runtime.InteropServices.WindowsRuntime;
    using (var _Stream = _Bitmap.PixelBuffer.AsStream())
    {
        _Stream.Seek(0, SeekOrigin.Begin);
        _Stream.Write(_Pixels, 0, _Pixels.Length);
        _Bitmap.Invalidate();
    }

    // determine destination
    var _Folder = Windows.Storage.ApplicationData.Current.TemporaryFolder;
    var _Name = color.ToString().TrimStart('#') + ".png";

    // use existing if already
    Windows.Storage.StorageFile _File;
    try { return await _Folder.GetFileAsync(_Name); }
    catch { /* do nothing; not found */ }
    _File = await _Folder.CreateFileAsync(_Name, Windows.Storage.CreationCollisionOption.ReplaceExisting);

    // extract stream to write
    // using System.Runtime.InteropServices.WindowsRuntime;
    using (var _Stream = _Bitmap.PixelBuffer.AsStream())
    {
        _Pixels = new byte[(uint)_Stream.Length];
        await _Stream.ReadAsync(_Pixels, 0, _Pixels.Length);
    }

    // write file
    using (var _WriteStream = await _File.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
    {
        var _Encoder = await Windows.Graphics.Imaging.BitmapEncoder
            .CreateAsync(Windows.Graphics.Imaging.BitmapEncoder.PngEncoderId, _WriteStream);
        _Encoder.SetPixelData(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8,
            Windows.Graphics.Imaging.BitmapAlphaMode.Premultiplied,
            (uint)_Bitmap.PixelWidth, (uint)_Bitmap.PixelHeight, 96, 96, _Pixels);
        await _Encoder.FlushAsync();
        using (var outputStream = _WriteStream.GetOutputStreamAt(0))
            await outputStream.FlushAsync();
    }

    return _File;
}

頑張ってください!

于 2013-05-15T20:42:09.580 に答える