从剪贴板保存图片

5
我想在WinRT中将一个图像从剪贴板保存到文件中,但我找不到方法。请问您能帮忙吗?
var dataPackage = Clipboard.GetContent();
            var t = await dataPackage.GetBitmapAsync();
            var t2 = await t.OpenReadAsync();
            t2.AsStream();
            t2.Seek(0);
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.SetSource(t2);
            Image image = new Image();
            image.Source = bitmapImage;<

1
什么问题?有错误吗? - DonBoitnott
没有错误。但我不知道如何将它保存到文件中。 - Taladan
您有一个 Image 对象...所以:image.Save("C:\\myDir\\myFile.png", System.Drawing.Imaging.ImageFormat.Png); - DonBoitnott
在Windows RT中,Windows.ui.controls.image中不可用Image.save。 - Taladan
如果我的回答对您有帮助,请接受它。这也将有助于其他可能遇到类似问题的开发人员。 - Farhan Ghumra
3个回答

4

请注意,您不能使用任何文件夹进行保存。我已将 ApplicationData.Current.LocalFolder.Path 作为目标传递。您可以使用 FolderPicker,然后传递所选文件夹的路径。

private async Task StoreImageFromClipboardAsync()
{
    var dataPackage = Clipboard.GetContent();
    var formats = dataPackage.AvailableFormats;
    if (formats.Contains("Bitmap"))
    {
        var t = await dataPackage.GetBitmapAsync();
        var file = await ChangeIRASRToStorageFileAsync(t, ApplicationData.Current.LocalFolder.Path, "Clipboard.png");
    }
}

private async Task<StorageFile> ChangeIRASRToStorageFileAsync(IRandomAccessStreamReference MyIRASR, String StorageFolderPath, String StorageFileName)
{
    IRandomAccessStreamWithContentType MyIRASWCT = await MyIRASR.OpenReadAsync();
    StorageFolder MyStorageFolder = await StorageFolder.GetFolderFromPathAsync(StorageFolderPath);
    StorageFile MyStorageFile = await MyStorageFolder.CreateFileAsync(StorageFileName, CreationCollisionOption.ReplaceExisting);
    Windows.Storage.Streams.Buffer MyBuffer = new Windows.Storage.Streams.Buffer(Convert.ToUInt32(MyIRASWCT.Size));
    IBuffer iBuf = await MyIRASWCT.ReadAsync(MyBuffer, MyBuffer.Capacity, InputStreamOptions.None);
    await FileIO.WriteBufferAsync(MyStorageFile, iBuf);
    return MyStorageFile;
}

0

上一个示例保存的是BMP图像而不是PNG图像。如果我想从剪贴板中保存PNG文件,以下解决方案适用于我:

private async Task StoreImageFromClipboardAsync()
{
  var dataPackage = Clipboard.GetContent();
  if (datapackage.Contains(StandardDataFormats.Bitmap))
  {
    var t = await dataPackage.GetBitmapAsync();
    var file = await SaveToPngTaskFile(t, ApplicationData.Current.LocalFolder, 
      "Clipboard.png");
  }
}

public static async Task<StorageFile> SaveToPngTaskFile
  (IRandomAccessStreamReference rndAccessStreamReference, 
   StorageFolder storageFolder, String storageFileName)
{
  IRandomAccessStreamWithContentType rndAccessStreamWithContentType = 
    await rndAccessStreamReference.OpenReadAsync();
  StorageFile storageFile = 
    await storageFolder.CreateFileAsync(storageFileName, 
      CreationCollisionOption.GenerateUniqueName);
  var decoder = await BitmapDecoder.CreateAsync(rndAccessStreamWithContentType);
  var pixels = await decoder.GetPixelDataAsync();
  var outStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);
  var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, outStream);
  encoder.SetPixelData(decoder.BitmapPixelFormat, BitmapAlphaMode.Ignore,
    decoder.OrientedPixelWidth, decoder.OrientedPixelHeight,
    decoder.DpiX, decoder.DpiY,
    pixels.DetachPixelData());
  await encoder.FlushAsync();
  outStream.Dispose();
  return storageFile;
}

0

就这么简单,只需将最后一行代码添加到您现有的代码中(例如 PNG)

var dataPackage = Clipboard.GetContent();
            var t = await dataPackage.GetBitmapAsync();
            var t2 = await t.OpenReadAsync();
            t2.AsStream();
            t2.Seek(0);
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.SetSource(t2);
            Image image = new Image();
            image.Source = bitmapImage;
            image.Save("ImagePathToStore.png", System.Drawing.Imaging.ImageFormat.PNG);

支持的图像格式链接


Windows RT 中的 Windows.UI.Controls.Image 不支持 Image.Save 方法。 - Taladan
image.Save 不是 WinRT API 的一部分。 - Farhan Ghumra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接