2012-04-07 16 views
6

utilizo esta línea a continuación para crear mi mapa de bits:Obtener el nombre del archivo de mapa de bits

Bitmap b = new Bitmap(@"C:\<file name>"); 

Después modifico este mapa de bits y quiero guardarlo como en la línea de abajo:

b.Save(@"C:\\<other file name>") 

Mi pregunta es - cómo obtener el nombre de archivo bitmap de la propiedad.
En pocas palabras, necesito guardar el mapa de bits con el mismo nombre con el que lo inicié.

Gracias

+4

No obtiene ayuda de Bitmap, no hace un seguimiento de un nombre de archivo. Tampoco tiene que crearse un mapa de bits a partir de un archivo, tiene varios constructores. Tendrá que hacer un seguimiento de esto usted mismo con una variable de cadena. –

+0

entiendo, gracias! –

Respuesta

5

Tal vez sea posible haz esto con Metadata - pero no estoy familiarizado con este tema, así que no estoy completamente seguro de que sea posible, ni tampoco sé cómo hacerlo.
Lo que do sugiero es hacer un tipo.

Así, por ejemplo, puede crear una clase que tendrá una propiedad Bitmap(1) para la imagen y una cadena para la ruta del archivo.

class LocalBitmap 
{ 
    public Bitmap Bitmap { get; set; } 
    public String Path { get; set; } 

    public LocalBitmap(String path) 
    { 
     Path = path; 
     Bitmap = new Bitmap(path); 
    } 
} 

y usarlo de esta manera:

LocalBitmapimage = new LocalBitmap(@"C:\myImage.bmp"); 


(1) Considere el uso de la clase Image lugar. Es la clase base de Bitmap.Si no está seguro de cuál usar, pregúntese si su clase requiere una imagen o una imagen de ese formato exacto (es decir, mapa de bits).

+0

¡Gracias! Esto es lo que estaba buscando. –

5

Se puede usar una variable:

var name = @"C:\<file name>"; 

y luego:

using (Bitmap b = new Bitmap(name)) 
{ 
    ... 
    b.Save(name); 
} 

Observe también que he envuelto la instancia Bitmap en un comunicado using con el fin de liberar no administrado recursos que están asociados con él tan pronto como hayamos terminado con él. Siempre debe ajustar los objetos IDisposable en las declaraciones using.

+2

El código publicado no puede funcionar, siempre arroja una Excepción Externa. Al cargar un mapa de bits desde un archivo, se establece un bloqueo en el archivo, un bloqueo creado por la sección del archivo mapeado de memoria que GDI + utiliza para asignar los datos de píxeles a la memoria. El mapa de bits debe estar dispuesto para liberar el bloqueo. Buen problema de huevo y pollo aquí :) Use el constructor Bitmap (Imagen) para crear la copia requerida. –

0

No es así. Simplemente. Básicamente, el mapa de bits no recuerda el archivo, es su trabajo.

Básicamente, el tesay "Me llega una foto enviada por UPS, después de desempacarla, unos días después, ¿cómo puedo encontrar el número de envío en la imagen?" - tú no.

8

La respuesta aumentada le causará problemas. Al cargar un mapa de bits desde un archivo, se bloquea el archivo. No puede guardarlo nuevamente sin deshacerse primero del mapa de bits. Que es un problema de huevo y gallina que no puedes resolver sin clonar el mapa de bits. Lo cual es un poco complicado en sí mismo, el método Bitmap.Clone() es una versión optimizada que usa la misma sección de memoria que puso el candado en el archivo en primer lugar. Entonces, realmente no libera el bloqueo.

He aquí una pequeña clase que se encarga de la creación de un clon de profundidad y memoriza la trayectoria y el formato de mapa de bits original:

class EditableBitmap : IDisposable { 
     public EditableBitmap(string filepath) { 
      using (var bmp = new Bitmap(filepath)) { 
       this.bitmap = new Bitmap(bmp); 
       this.bitmap.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution); 
      } 
      this.path = System.IO.Path.GetFullPath(filepath); 
      this.format = bitmap.RawFormat; 
     } 

     public Bitmap Bitmap { get { return bitmap; } } 

     public void Save() { 
      bitmap.Save(path, format); 
      this.Dispose(); 
     } 

     public void Dispose() { 
      if (bitmap != null) { 
       bitmap.Dispose(); 
       bitmap = null; 
      } 
     } 
     private Bitmap bitmap; 
     private System.Drawing.Imaging.ImageFormat format; 
     private string path; 
    } 

y usarlo como esto:

 using (var bmp = new EditableBitmap(@"c:\temp\test.png")) { 
      DoSomething(bmp.Bitmap); 
      bmp.Save(); 
     } 
+0

¿Por qué necesita almacenar ImageFormat? – gliderkite

+0

Porque normalmente le gustaría guardar el mapa de bits modificado con el mismo formato de imagen. No es automático cuando utiliza Image.Save (cadena), que siempre se guarda en el formato PNG. –

0

Otra forma de evitar el problema de bloqueo del archivo que describe Hans es freeze la imagen.

public PhotoImageSource GetImage() 
{ 
    string filename = "c:\Images\myimage.png"; 
    var image = new BitmapImage(); 
    using (var stream = new FileStream(fileName, FileMode.Open)) 
    { 
     image.BeginInit(); 
     image.CacheOption = BitmapCacheOption.OnLoad; 
     image.StreamSource = stream; 
     image.EndInit(); 
    } 
    image.Freeze(); //prevent error "Must create DependencySource on same Thread as the DependencyObject" 
    return new PhotoImageSource(image, filename); 
} 

public class PhotoImageSource 
{ 
    public PhotoImageSource(ImageSource image, string filename) 
    { 
     Image = image; 
     Filename = filename; 
    } 
    public ImageSource Image { get; set; } 
    public string Filename { get; set; } 
} 
0

Una posible solución es usar la propiedad Tag del mapa de bits para almacenar la ruta en la creación ..

string pathToBitmap = @"C:\myImage.bmp"; 
Bitmap myBitmap = new Bitmap(pathToBitmap) { Tag = pathToBitmap }; 

..y luego recuperar la ruta más adelante ..

string pathFromBitmap = (string)myBitmap.Tag; 

... solo asegúrese de convertir la etiqueta como cadena, y también para copiar la etiqueta en cualquier instancia hecha desde el mapa de bits de origen.

Cuestiones relacionadas