2012-10-12 21 views
1

我開發一個程序來擴展一些位圖圖像成爲我的瓷磚通知的一部分窗口 - 8應用如何調整位圖圖像是<200 KB,滿足瓷磚限制(WinRT的)

的圖塊的尺寸必須尺寸爲< 200KB且小於1024x1024 px。我可以使用縮放例程來根據需要調整源圖像的大小,以適應1024x1024 px尺寸限制。

如何更改源圖像以確保能夠滿足尺寸限制?

我的第一次嘗試是繼續縮小圖像,直到它清除大小閾值,並使用isTooBig = destFileStream.Size > MaxBytes來確定大小。但是,下面的代碼會導致無限循環。我如何可靠地測量目標文件的大小?

 bool isTooBig = true; 
     int count = 0; 
     while (isTooBig) 
     { 
      // create a stream from the file and decode the image 
      using (var sourceFileStream = await sourceFile.OpenAsync(Windows.Storage.FileAccessMode.Read)) 
      using (var destFileStream = await destFile.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       BitmapDecoder decoder = await BitmapDecoder.CreateAsync(sourceFileStream); 
       BitmapEncoder enc = await BitmapEncoder.CreateForTranscodingAsync(destFileStream, decoder); 


       double h = decoder.OrientedPixelHeight; 
       double w = decoder.OrientedPixelWidth; 

       if (h > baselinesize || w > baselinesize) 
       { 
        uint scaledHeight, scaledWidth; 

        if (h >= w) 
        { 
         scaledHeight = (uint)baselinesize; 
         scaledWidth = (uint)((double)baselinesize * (w/h)); 
        } 
        else 
        { 
         scaledWidth = (uint)baselinesize; 
         scaledHeight = (uint)((double)baselinesize * (h/w)); 
        } 

        //Scale the bitmap to fit 
        enc.BitmapTransform.ScaledHeight = scaledHeight; 
        enc.BitmapTransform.ScaledWidth = scaledWidth; 
       } 

       // write out to the stream 
       await enc.FlushAsync(); 

       await destFileStream.FlushAsync(); 

       isTooBig = destFileStream.Size > MaxBytes; 
       baselinesize *= .90d * ((double)MaxBytes/(double)destFileStream.Size); 
      } 
     } 

回答

1

你能不使用寬×高×colourDepth計算它(其中colourDepth是以字節爲單位,所以32位= 4字節)。大概你保持寬高比,所以你只需要縮小寬度/高度,直到你發現它小於200KB。

這假定輸出是一個位圖,因此是未壓縮的。

+0

謝謝 - 我會調查這一點。我是位圖操作的新手 – cordialgerm

1

考慮到瓷磚尺寸爲方形瓷磚的150x150或寬瓷磚的310x150,您應該可以將圖像縮小到合適的尺寸,並且使用jpeg壓縮,幾乎可以保證在200k以下。將壓縮質量設置在80左右。它可以保持良好的壓縮比,同時保持良好的圖像質量。