C# 保存图像表单剪贴板

C# 保存图像表单剪贴板,c#,image,windows-runtime,save,clipboard,C#,Image,Windows Runtime,Save,Clipboard,我想在winrt中将剪贴板中的一个图像保存到文件中。但是我没有办法。你能帮忙吗 var dataPackage = Clipboard.GetContent(); var t = await dataPackage.GetBitmapAsync(); var t2 = await t.OpenReadAsync(); t2.AsStream(); t2.Seek(0); Bit

我想在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;<
var dataPackage=Clipboard.GetContent();
var t=await dataPackage.GetBitmapAsync();
var t2=await t t.OpenReadAsync();
t2.AsStream();
t2.Seek(0);
BitmapImage BitmapImage=新的BitmapImage();
bitmapImage.SetSource(t2);
图像=新图像();
image.Source=位图图像<

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

给你:)

请注意,您不能使用任何文件夹进行保存。我已将
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;
}
private async Task StoreImageFromClipboardAsync()
{
var dataPackage=Clipboard.GetContent();
var formats=dataPackage.AvailableFormats;
if(formats.Contains(“位图”))
{
var t=await dataPackage.GetBitmapAsync();
var file=wait ChangeIRASRToStorageFileAsync(t,ApplicationData.Current.LocalFolder.Path,“Clipboard.png”);
}
}
专用异步任务更改irasrtostoragefileasync(irandomaccesstreamreference MyIRASR、String-StorageFolderPath、String-StorageFileName)
{
irandomaccesstreamwithcontenttype MyIRASWCT=await MyIRASR.OpenReadAsync();
StorageFolder MyStorageFolder=等待StorageFolder.GetFolderFromPathAsync(StorageFolderPath);
StorageFile MyStorageFile=等待MyStorageFolder.CreateFileAsync(StorageFileName,CreationCollisionOption.ReplaceExisting);
Windows.Storage.Streams.Buffer MyBuffer=新的Windows.Storage.Streams.Buffer(Convert.ToUInt32(MyIRASWCT.Size));
IBuffer iBuf=wait MyIRASWCT.ReadAsync(MyBuffer,MyBuffer.Capacity,InputStreamOptions.None);
wait FileIO.WriteBufferAsync(MyStorageFile,iBuf);
返回MyStorageFile;
}

最后一个post示例保存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;
}
private async Task StoreImageFromClipboardAsync()
{
var dataPackage=Clipboard.GetContent();
if(datapackage.Contains(StandardDataFormats.Bitmap))
{
var t=await dataPackage.GetBitmapAsync();
var file=wait SaveToPngTaskFile(t,ApplicationData.Current.LocalFolder,
“Clipboard.png”);
}
}
公共静态异步任务SaveToPngTaskFile
(IRandomaccesstreamreference rndAccessStreamReference,
StorageFolder StorageFolder,字符串storageFileName)
{
IRANDOMACessStreamWithContentType rndAccessStreamWithContentType=
等待rndAccessStreamReference.OpenReadAsync();
StorageFile StorageFile=
等待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=等待BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,扩展流);
编码器.SetPixelData(解码器.BitmapPixelFormat,BitmapAlphaMode.Ignore,
decoder.OrientedPixelWidth,decoder.OrientedPixelHeight,
decoder.DpiX,decoder.DpiY,
pixels.DetachPixelData());
等待编码器。FlushAsync();
exptream.Dispose();
返回存储文件;
}

问题出在哪里?这是错误吗?没有错误。但是我不知道如何将它保存到文件中。您有一个
图像
对象…所以:
图像.save(“C:\\myDir\\myFile.png”,System.Drawing.Imaging.ImageFormat.png)Image.save在Windows.ui.controls.Image中不可用,请接受我的答案,如果它对您有帮助的话。它还将帮助其他可能面临此类问题的开发人员。Image.save在Windows RT的Windows.ui.controls.Image中不可用。
Image.save
不是WinRT API的一部分。
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;
}