C #: GDI +: перезапись изображения с использованием метода сохранения растрового изображения - PullRequest
7 голосов
/ 24 июня 2009

У меня есть страница ASP.NET C #, где я изменяю размеры изображений в папке. Для этого я использую GDI +. Я хочу изменить размеры изображений и заменить их старыми изображениями. Так что, когда я пытаюсь сохранить существующее имя, метод Save выдает ошибку. Но если я даю другое имя, оно сохраняется. Но я хочу иметь то же имя файла для вновь созданного изображения с измененным размером, поскольку мне нужно перезаписать существующий файл новым файлом. который изменен. Любая идея, как идти вперед. Мой код

     oldImagePath= oldImagePath.Replace(".jpg", "NEW.jpg");

        try
        {
            ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders();
            EncoderParameters Params = new EncoderParameters(1);
            Params.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
            target.Save(oldImagePath, Info[1], Params);
        }

Если я прокомментирую первую строку, которая создаст новое имя для файла назначения, ОНА не будет работать. В другом случае это будет. Но я хочу иметь то же имя. Любая мысль ?? ? Заранее спасибо

Ответы [ 2 ]

19 голосов
/ 09 ноября 2009

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

 Image imgPhoto = Image.FromFile("myphoto.jpg");

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

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

Вы можете сделать это следующим образом:

FileStream fs = new FileStream("myphoto.jpg", FileMode.Open);
Image imgPhoto = Image.FromStream(fs);
fs.Close();
11 голосов
/ 24 июня 2009

Сначала необходимо удалить исходный файл. Важно сделать различие - когда вы работаете с обработкой изображений в .NET, вы работаете с объектом в памяти, байты которого были заполнены чтением исходного изображения. Вы не работаете с фактическим исходным изображением. Поэтому, когда вы сохраните этот совершенно новый объект (который использует данные из существующего изображения) и попытаетесь использовать уже используемый путь, вы получите исключение.

Вы также должны убедиться, что исходный файл все еще не открыт в данный момент; Обязательно избавьтесь от исходного потока файлов, который вы использовали для заполнения объекта Image, которым вы управляете. Затем удалите, затем сохраните.

...