CroppedBitmap non sembra supportare l'aggiunta di spazio attorno a un'immagine, quindi è possibile creare un'immagine trasparente della dimensione corretta utilizzando WriteableBitmap. Se l'input è inferiore alla dimensione target, questo metodo lo ingrandirà, ma è facile modificarlo.
public static BitmapSource FitImage(BitmapSource input, int width, int height)
{
if (input.PixelWidth == width && input.PixelHeight == height)
return input;
if(input.Format != PixelFormats.Bgra32 || input.Format != PixelFormats.Pbgra32)
input = new FormatConvertedBitmap(input, PixelFormats.Bgra32, null, 0);
//Use the same scale for x and y to keep aspect ratio.
double scale = Math.Min((double)width/input.PixelWidth, height/(double)input.PixelHeight);
int x = (int)Math.Round((width - (input.PixelWidth * scale))/2);
int y = (int)Math.Round((height - (input.PixelHeight * scale))/2);
var scaled = new TransformedBitmap(input, new ScaleTransform(scale, scale));
var stride = scaled.PixelWidth * (scaled.Format.BitsPerPixel/8);
var result = new WriteableBitmap(width, height, input.DpiX, input.DpiY, input.Format,null);
var data = new byte[scaled.PixelHeight * stride];
scaled.CopyPixels(data, stride, 0);
result.WritePixels(new Int32Rect(0,0,scaled.PixelWidth,scaled.PixelHeight), data, stride,x,y);
return result;
}
Se sei già il rendering di contenuti utilizzando RenderTargetBitmap si poteva avvolgerlo in un viewBox per fare la scala, ma se si sta solo lavorando con immagini normali userei il metodo di cui sopra.
@Kris Sembra molto promettente. Sono nuovo di questi metodi. Puoi dirmi la differenza tra BitmapSource e BitmapFrame? Sto usando BitmapFrame per ridimensionare la mia immagine. – mrtsherman
@Kris Okay, vedo che BitmapFrame è figlio di BitmapSource. Quindi dovrebbe essere in grado di adattare il codice al lavoro. Provando me stesso adesso. – mrtsherman
L'uso principale di BitmapFrame è dato dal fatto che alcuni formati di immagine come gif possono avere più fotogrammi, inoltre li lega a un decodificatore e fornisce una miniatura, per una spiegazione migliore vedi http://stackoverflow.com/questions/155391/difference-training- a-bitmapframe-and-bitmapimage-in-wpf – Kris