Получить растровый файл

Я использую эту строку ниже для создания растрового изображения:

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

после того, как я изменю это растровое изображение, и я хочу сохранить его, как в строке ниже:

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

мой вопрос - Как получить растровое изображение имени файла из свойства.
Проще говоря, мне нужно сохранить растровое изображение с тем же именем, с которым я его инициировал.

спасибо

6 ответов


возможно, вы можете сделать это с помощью метаданных - но я не знаком с этой темой, поэтому я не совсем уверен, что это возможно, и не знаю, как это сделать.
Что Я!--6-->do предлагаю сделать типа.

Так, например, вы можете создать класс, который будет иметь точечный(1) свойство для изображения и строка для пути к файлу.

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

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

и использовать его как Итак:

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


(1) рассмотрите возможность использования изображения класса. Это базовый класс точечный. Если вы не уверены, какой из них использовать, спросите себя, требуется ли вашему классу изображение или изображение именно этого формата (то есть растровое изображение).

повышенный ответ приведет вас к неприятностям. Загрузка растрового изображения из файла блокирует файл. Вы не можете сохранить его обратно, не избавившись сначала от растрового изображения. Это проблема курицы и яйца, которую вы не можете решить без клонирования растрового изображения. Что само по себе немного сложно, растровое изображение.Метод Clone () - это оптимизированная версия, которая использует тот же раздел памяти, который в первую очередь блокирует файл. Так что на самом деле не освобождает замок.

здесь небольшой класс, который заботится о создании глубокого клона и запоминает путь и формат исходного растрового изображения:

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

и используйте его так:

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

вы можете использовать переменную:

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

и затем:

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

Также обратите внимание, что я обернул Bitmap экземпляр в using оператор, чтобы освободить неуправляемые ресурсы, которые связаны с ним, как только мы закончим с ним. Вы всегда должны обернуть IDisposable объекты using заявления.


нет. Просто. В основном растровое изображение не запоминает файл-это ваша работа.

вы в основном tesay " я получаю изображение, отправленное UPS, после его распаковки-через несколько дней-как найти номер доставки на картинке?- ...ты не знаешь.


другой способ обойти проблему блокировки файла, который описывает Ханс, - это freeze изображение.

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

возможной работой является использование свойства тега растрового изображения для хранения пути при создании..

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

..а потом вернуть путь..

string pathFromBitmap = (string)myBitmap.Tag;

..просто не забудьте привести тег как строку, а также скопировать тег в любые экземпляры, сделанные из исходного растрового изображения.