2008-09-30 22 views

Respuesta

12

Debe utilizar la clase abstracta BitmapSource si necesita obtener los bits, o incluso ImageSource si solo desea dibujalo.

La implementación BitmapFrame es solo la naturaleza orientada a objetos de la implementación que se muestra. Realmente no debería tener ninguna necesidad de distinguir entre las implementaciones. BitmapFrames puede contener un poco de información adicional (metadatos), pero por lo general solo le importaría una aplicación de imágenes.

Se dará cuenta de estas otras clases que heredan de BitmapSource:

  • BitmapFrame
  • BitmapImage
  • CachedBitmap
  • ColorConvertedBitmap
  • CroppedBitmap
  • FormatConvertedBitmap
  • RenderTargetBitmap
  • TransformedBitmap
  • WriteableBitmap

Usted puede obtener una BitmapSource de un URI mediante la construcción de un objeto BitmapImage:

Uri uri = ...; 
BitmapSource bmp = new BitmapImage(uri); 
Console.WriteLine("{0}x{1}", bmp.PixelWIdth, bmp.PixelHeight); 

El BitmapSource también podría provenir de un decodificador. En este caso, está utilizando indirectamente BitmapFrames.

Uri uri = ...; 
BitmapDecoder dec = BitmapDecoder.Create(uri, BitmapCreateOptions.None, BitmapCacheOption.Default); 
BitmapSource bmp = dec.Frames[0]; 
Console.WriteLine("{0}x{1}", bmp.PixelWIdth, bmp.PixelHeight); 
+0

¿Cómo se usa una ImageSource? ¿Cómo se carga un BitmapSource con un Uri? –

0

BitmapFrame es una primitiva de bajo nivel para la manipulación de imágenes. Por lo general, se utiliza cuando desea codificar/decodificar algunas imágenes de un formato a otro.

BitmapImage es una abstracción de más alto nivel que tiene algunas propiedades claras de unión de datos (UriSource, etc.).

Si solo está mostrando imágenes y desea un ajuste fino BitmapImage es lo que necesita.

Si está realizando una manipulación de imágenes de bajo nivel, necesitará BitmapFrame.

0

Sé que esta es una pregunta antigua, pero la respuesta aceptada es incompleta (no sugerir que mi respuesta esté completa tampoco) y mi adición puede ayudar a alguien en alguna parte.

La razón (aunque la única razón) utilizo un BitmapFrame es cuando accedo a los cuadros individuales de una imagen TIFF de múltiples enmarcado utilizando la clase de TiffBitmapDecoder. Por ejemplo,

TiffBitmapDecoder decoder = new TiffBitmapDecoder(
    new Uri(filename), 
    BitmapCreateOptions.None, 
    BitmapCacheOption.None); 

for (int frameIndex = 0; frameIndex < decoder.Frames.Count; frameIndex++) 
{ 
    BitmapFrame frame = decoder.Frames[frameIndex]; 
    // Do something with the frame 
    // (it inherits from BitmapSource, so the options are wide open) 
} 
Cuestiones relacionadas