【问题标题】:How to create a writeablebitmap image from an image file in windows8如何在 windows8 中从图像文件创建可写位图图像
【发布时间】:2013-01-16 06:45:50
【问题描述】:

我想从本地磁盘加载一个图像文件到一个可写位图图像,这样我就可以让用户编辑它。当我创建WriteableBitmap对象时,构造函数需要pixelwidth和pixelheight参数,不知道这两个从哪里得到,谁能帮忙?

【问题讨论】:

  • 如何从文件中加载图片?
  • 但我猜你是通过 BitmapImage 或类似的方式加载图像,然后 然后 你创建了一个 WriteableBitmap,对吗?
  • 是的,我想加载文件,然后将其转换为 writeablebitmap。但我不知道怎么做。

标签: c# xaml windows-8 writeablebitmap


【解决方案1】:

定义WriteableBitmap图像时不要关心pixelWidth和pixelHeight,请试试这个:

using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    WriteableBitmap image = new WriteableBitmap(1, 1);
    image.SetSource(stream);
    WriteableBitmapImage.Source = image;
}

【讨论】:

    【解决方案2】:

    如果您想拥有正确的像素宽度和高度,您需要先将其加载到 BitmapImage 中才能正确填充:

    StorageFile storageFile =
        await StorageFile.GetFileFromApplicationUriAsync("ms-appx:///myimage.png");
    using (IRandomAccessStream fileStream = await storageFile.OpenAsync(FileAccessMode.Read))
    {
        BitmapImage bitmapImage = new BitmapImage();
        await bitmapImage.SetSourceAsync(fileStream);
    
        WriteableBitmap writeableBitmap =
            new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
        fileStream.Seek(0);
        await writeableBitmap.SetSourceAsync(fileStream);
    }
    

    (对于 WinRT 应用程序)

    【讨论】:

      【解决方案3】:

      试试下面的代码。有一种简单的方法可以做到这一点(使用 BitmapImage 加载图像,然后将此对象直接传递给 WriteableBitmap 构造函数,但我不确定这是否按预期工作或有性能问题,不记得了):

      BitmapSource bmp = BitmapFrame.Create(
          new Uri(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg", UriKind.Relative),
          BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
      
      if (bmp.Format != PixelFormats.Bgra32)
          bmp = new FormatConvertedBitmap(bmp, PixelFormats.Bgra32, null, 1);
          // Just ignore the last parameter
      
      WriteableBitmap wbmp = new WriteableBitmap(bmp.PixelWidth, bmp.PixelHeight,
          kbmp.DpiX, bmp.DpiY, bmp.Format, bmp.Palette);
      
      Int32Rect r = new Int32Rect(0, 0, bmp.PixelWidth, bmp.PixelHeight);
      wbmp.Lock();
      bmp.CopyPixels(r, wbmp.BackBuffer, wbmp.BackBufferStride * wbmp.PixelHeight,
          wbmp.BackBufferStride);
      
      wbmp.AddDirtyRect(r);
      wbmp.Unlock();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多