BitmapEncoder與BitmapDecoder的使用

 

當你想要把圖檔讀進程式可以使用BitmapDecoder(解碼),

而當你想要從程式轉存成圖檔時可以使用BitmapEncoder(編碼)。

不過比較常用的是JpegBitmapEncoder與JpegBitmapDecoder或PNG格式。

 

一、解碼範例


private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Stream imageStreamSource = new FileStream("smiley.png", FileMode.Open, FileAccess.Read, FileShare.Read);

    //將Stream轉成PngBitmapDecoder執行個體
    PngBitmapDecoder decoder = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

    //使用 BitmapFrame 做為 BitmapSource,BitmapSource為WPF專用處理格式
    BitmapSource bitmapSource = decoder.Frames[0];

    //將bitmapSource傳給Image物件做顯示
    imgShow.Source = bitmapSource;
    imgShow.Stretch = Stretch.None;
    imgShow.Margin = new Thickness(20);//功能相等於CSS的Margin
}

範例檔

 

二、編碼範例


private void Window_Loaded(object sender, RoutedEventArgs e)
{
    //從Image物件讀取圖片成BitmapSource格式
    BitmapSource image = (BitmapSource)imgShow.Source;
    
    if (File.Exists("new.png"))
    {
        File.Delete("new.png");
    }

    FileStream stream = new FileStream("new.png", FileMode.Create);
    PngBitmapEncoder encoder = new PngBitmapEncoder();

    //PngInterlaceOption.On代表瀏覽器讀取該圖片時就會以由模糊逐漸轉為清晰的效果方式漸漸顯示出來
    encoder.Interlace = PngInterlaceOption.On;

    //將BitmapSource轉成BitmapFrame格式,BitmapFrame專門處理影像相關
    encoder.Frames.Add(BitmapFrame.Create(image));

    //儲存成PNG檔
    encoder.Save(stream);
}

範例檔

於編碼範例需要特別注意重複呼叫Save方法會有

「Cannot call Save on an Encoder more than once」問題。

目前我想到避掉的方法有重新new一個記憶體位置給他再使用Save方法。

不然就是先取出PngBitmapEncoder.Frames[0],然後再使用Clone()方法,

或使用CopyPixels()方法將整個點陣圖像素資料複製到其他地方去再Save。

 

類別關鍵字額外說明

ImageSource:WPF中的Image物件的Source屬性之型別。

BitmapSource:是WPF影像處理的基本區塊。是虛擬類別,BitmapFrame會繼承他。

BitmapImage:BitmapSource的衍生類別。

BitmapFrame:表示解碼器所傳回和編碼器所接受的影像資料。

RenderTargetBitmap:將 Visual 物件轉換成點陣圖,會繼承BitmapSource。

WriteableBitmap:提供可以寫入及更新的 BitmapSource,會繼承BitmapSource

                             ,他與RenderTargetBitmap都是BitmapSource的延伸應用。

BitmapEncoder:是虛擬類別,一些JpegBitmapEncoder與PngBitmapEncoder會繼承他。

 

參考資料:

零元學Expression Blend 4 - Chapter 3 熟悉操作第一步(製作一個猴子臉)