Не сохраняется картинка через C#

Victor

Client
Регистрация
22.06.2014
Сообщения
89
Благодарностей
4
Баллы
8
Пытаюсь через C# изменить размеры картинки.
В переменной imageAddress находится адрес картинки - "C:\Users\Admin\Desktop\скрины\mst_gujrat_chennai.jpg".

Код C# следующий:

Код:
string originalPicPath = project.Variables["imageAddress"].Value;
int newWidth = 300;
int newHeight = 153;
System.Drawing.Image image = System.Drawing.Image.FromFile(originalPicPath);
System.Drawing.Image resized = image.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);
resized.Save(originalPicPath);
image.Dispose();
resized.Dispose();
Мне нужно взять картинку, и ее же пересохранить.
Если убираю строку resized.Save(originalPicPath);, то код отрабатывает без ошибок.
В чем тут проблема?

И еще вопрос. Можно ли задать только ширину, а высота задавалась пропорционально уменьшению ширины?
 

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
392
Баллы
63
нельзя сохранять в занятый файл. сначала надо его освободить.
 

Victor

Client
Регистрация
22.06.2014
Сообщения
89
Благодарностей
4
Баллы
8

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
392
Баллы
63

Victor

Client
Регистрация
22.06.2014
Сообщения
89
Благодарностей
4
Баллы
8
использовать Dispose или Using
Тоже не работает.
Пытаюсь удалить файл во второй строке.

C#:
string originalPicPath = project.Variables["imageAddress"].Value;
originalPicPath.Dispose();
int newWidth = 300;
int newHeight = 153;
System.Drawing.Image image = System.Drawing.Image.FromFile(originalPicPath);
System.Drawing.Image resized = image.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);
resized.Save(originalPicPath);
image.Dispose();
resized.Dispose();
 

Victor

Client
Регистрация
22.06.2014
Сообщения
89
Благодарностей
4
Баллы
8
Разобрался. Работает следующий код:

C#:
string originalPicPath = project.Variables["imageAddress"].Value;

int newWidth = 300;
int newHeight = 153;

System.Drawing.Image image = System.Drawing.Image.FromFile(originalPicPath);
System.Drawing.Image resized = image.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);

image.Dispose();
File.Delete(originalPicPath);

resized.Save(originalPicPath);
resized.Dispose();
 
  • Спасибо
Реакции: zarufakis

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
548
Благодарностей
1 126
Баллы
93
Разобрался. Работает следующий код:

C#:
string originalPicPath = project.Variables["imageAddress"].Value;

int newWidth = 300;
int newHeight = 153;

System.Drawing.Image image = System.Drawing.Image.FromFile(originalPicPath);
System.Drawing.Image resized = image.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);

image.Dispose();
File.Delete(originalPicPath);

resized.Save(originalPicPath);
resized.Dispose();
В статье @samsonnn все очень хорошо написано.
28. Resize - Изменение размера
Плюс данное решение короче и понятнее, представленного выше.

Проверил у себя решение:
C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Resize(225, 150);
       image.Write(SaveImagePath);
}
Исходное изображение:
Изображение.jpg

Результат:
Изображение[mini].jpg


Изображение[mini].jpg



Ответ на тему, так как эта тема является продолжением: Как уменьшить изображение без потери качества?
Как видно на примере из 2к изображение. Качество не падает.

Чтобы все работало, надо следовать инструкциям под спойлером: Подключение библиотеки Magick.NET

↓ шаблон на котором тестировал
 

Вложения

Victor

Client
Регистрация
22.06.2014
Сообщения
89
Благодарностей
4
Баллы
8
В статье @samsonnn все очень хорошо написано.
28. Resize - Изменение размера
Плюс данное решение короче и понятнее, представленного выше.

Проверил у себя решение:
C#:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Resize(225, 150);
       image.Write(SaveImagePath);
}
Исходное изображение:
Посмотреть вложение 109057

Результат:
Посмотреть вложение 109058

Посмотреть вложение 109059


Ответ на тему, так как эта тема является продолжением: Как уменьшить изображение без потери качества?
Как видно на примере из 2к изображение. Качество не падает.

Чтобы все работало, надо следовать инструкциям под спойлером: Подключение библиотеки Magick.NET

↓ шаблон на котором тестировал
А можно как-то задать размер только для ширины, а высота считалась автоматически пропорционально?
Сейчас жестро заданы ширина и высота (225, 150)
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
548
Благодарностей
1 126
Баллы
93
А можно как-то задать размер только для ширины, а высота считалась автоматически пропорционально?
Сейчас жестро заданы ширина и высота (225, 150)
Да конечно. Вот так:
Изменение размера изображения если известна только ширина:
string InputImagePath = project.Variables["InputImagePath"].Value; // В переменной InputImagePath указать путь к изображению
string SaveImagePath = project.Variables["SaveImagePath"].Value; // В переменной SaveImagePath указать путь куда сохраняем обработанное изображение

using (MagickImage image = new MagickImage(InputImagePath))
{
    int targetWidth = 225;
    int targetHeight = (int)(((double)image.Height / image.Width) * targetWidth);

    image.Resize(targetWidth, targetHeight);
    image.Write(SaveImagePath);
}
 

Вложения

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)