2012-04-07 3 views
6

Io uso questa linea di seguito per creare la mia Bitmap:Ottenere il nome del file bitmap

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

Dopo aver modificare questo bitmap e voglio salvarlo come in linea di seguito:

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

La mia domanda è - come ottenere il nome del file bitmap dalla proprietà.
In poche parole, ho bisogno di salvare la bitmap con lo stesso nome con cui l'avevo avviata.

Grazie

+4

Non ottieni aiuto da Bitmap, non tiene traccia del nome di un file. Né una bitmap deve essere creata da un file, ma ha diversi costruttori. Avrai bisogno di tenerti traccia di te stesso con una variabile stringa. –

+0

capisco, grazie! –

risposta

5

forse si può fai questo con Metadata - ma non ho familiarità con questo argomento, quindi non sono completamente sicuro che sia possibile, né io come farlo.
Cosa I do suggerire è fare un tipo.

Quindi, ad esempio, è possibile creare una classe che disporrà di una proprietà Bitmap(1) per l'immagine e una stringa per il percorso del file.

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

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

e usarlo in questo modo:

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


(1) Si consiglia di utilizzare la classe Image invece. È la classe base di Bitmap.Se non sei sicuro di quale utilizzare, chiediti se la tua classe richiede un'immagine o un'immagine di quel formato esatto (cioè bitmap).

+0

Grazie! questo è quello che stavo cercando. –

5

Si potrebbe utilizzare una variabile:

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

e poi:

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

Si noti anche che ho avvolto l'istanza Bitmap in una dichiarazione di using al fine di rilasciare non gestito risorse che sono associate con esso non appena abbiamo finito con esso. Dovresti sempre inserire gli oggetti IDisposable nelle dichiarazioni using.

+2

Il codice pubblicato non può mai funzionare, genera sempre un'eccezione esterna. Il caricamento di una bitmap da un file pone un blocco sul file, un blocco creato dalla sezione del file di memoria mappata che GDI + utilizza per mappare i dati dei pixel in memoria. La bitmap deve essere eliminata per rilasciare il blocco. Bel problema di pollo e uova qui :) Usa il costruttore Bitmap (Immagine) per creare la copia richiesta. –

0

Non è così. Semplicemente. Fondamentalmente la bitmap non ricorda il file - è il tuo lavoro.

In pratica, tesay "Ricevo un'immagine mandata da UPS, dopo averla disimballata - giorni dopo - come trovo il numero di spedizione sulla foto?" - non lo fai.

8

La risposta in aumento ti porterà nei guai. Il caricamento di una bitmap da un file pone un blocco sul file. Non è possibile salvarlo di nuovo senza prima eliminare la bitmap. Che è un problema di gallina e uova che non è possibile risolvere senza clonare la bitmap. Il che è un po 'complicato in sé, il metodo Bitmap.Clone() è una versione ottimizzata che usa la stessa sezione di memoria che mette il blocco sul file in primo luogo. Quindi in realtà non rilascia il blocco.

Ecco un po 'di classe che si occupa di creare un clone profonda e memorizza il percorso e il formato del bitmap originale:

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; 
    } 

e usarlo in questo modo:

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

Perché è necessario memorizzare ImageFormat? – gliderkite

+0

Perché normalmente si vorrebbe salvare la bitmap modificata con lo stesso formato di immagine. Non è automatico quando usi Image.Save (stringa), che salva sempre nel formato PNG. –

0

Un altro modo per aggirare il problema del blocco del file descritto da Hans è freeze l'immagine.

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 possibile aggirare è quello di utilizzare la proprietà Tag del bitmap per memorizzare il percorso sulla creazione ..

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

..e poi recuperare il percorso più tardi ..

string pathFromBitmap = (string)myBitmap.Tag; 

..non dimenticarti di lanciare il Tag come stringa, e anche di copiare il Tag su qualsiasi istanza creata dalla bitmap di origine.