2016-04-14 28 views
0

我有這樣的代碼:不能使用C#的圖像寫入一個文件,由於未經授權的訪問異常

RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(525, 50, 96, 96, PixelFormats.Pbgra32); 
renderTargetBitmap.Render(/* controlName */); 
PngBitmapEncoder pngImage = new PngBitmapEncoder(); 
pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); 
using (Stream fileStream = File.Create(Environment.CurrentDirectory) 
{ 
    pngImage.Save(fileStream); 
} 

它應該從我的XAML控制,創造它的「截圖」,然後將其保存到圖像文件。但無論我嘗試傳遞給File.Create方法的目錄是什麼,我都會得到一個System.UnauthorizedAccessException

如何解決?謝謝。

注:我試圖以管理員身份運行Visual Studio,但沒有工作。

+2

您的應用程序沒有訪問目錄的權限。確保您寫入到您的應用程序所運行的帳戶具有寫入權限的位置。 –

+0

什麼是錯誤的完整堆棧跟蹤?你有沒有嘗試過使用'File.WriteAllBytes();'方法?嘗試將其保存到您登錄的用戶的桌面上。 – Wjdavis5

+0

@ WicherVisser-我嘗試了幾個位置,包括'C:\'驅動器,桌面以及應用程序本身的目錄。 – Sipo

回答

2

你必須通過一個文件名(包括可選的路徑)來File.Create,如:

File.Create("MyImage.png") 

var path = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "MyImage.png"); 

using (var fileStream = FileFile.Create(path)) 
{ 
    pngImage.Save(fileStream); 
} 
+0

是的。它完美的作品。謝謝。 問題是它會創建一個黑色的圖像。任何想法爲什麼? – Sipo

+0

呈現的控件是否即時創建,或者已經顯示在用戶界面的某個位置? – Clemens

+0

它在運行時的代碼中創建。在閱讀您的評論後,我嘗試將元素更改爲在XAML中創建的元素,並且它工作正常 - 但我試圖創建的「即時」不是。 – Sipo

-1

爲了擺脫黑色圖像的嘗試手動配置的在你使用它之後的對象。示例如下所示。

private void button_Click(object sender, RoutedEventArgs e) 
    { 
     RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(525, 50, 96, 96, PixelFormats.Pbgra32); 
     renderTargetBitmap.Render(btn_StartStop); 
     PngBitmapEncoder pngImage = new PngBitmapEncoder(); 
     pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); 
     FileStream stream = new FileStream("screenshot.png", FileMode.Create); 
     pngImage.Save(stream); 
     stream.Dispose();    
    } 
+0

這相當於'using'塊,其中'using'是首選方法。 – Clemens

+0

@Clemens完全理解,這些成像方法中的一些在使用塊內部時不能正確呈現圖像。 – Cuken