Обработка изображений: при добавлении водяного знака размер картинки увеличивается в десять раз

webmasterfree

Client
Регистрация
03.02.2019
Сообщения
116
Благодарностей
17
Баллы
18
Добрый день.
Беру картинку 1.jpg весом 100Кб добавляю на нее текст (3 слова) и преобразую в 2.jpg и вес увеличивается до 1-1,5 Мб!!!
Хз что делать с этим. пробовал качество менять - не помогло(
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 943
Благодарностей
4 339
Баллы
113
Да, есть такое. Встроенные кодеки C# не умеют нормально сжимать картинки.
Попробуйте поискать новые либы типа ImageMagick или по АПИ к какому-нибудь сервису подключиться.
Ещё можно тут параметрами поиграть https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/how-to-set-jpeg-compression-level
System.Drawing.Imaging.Encoder.Quality в основном.
И ещё там что-то с интерполяцией сглаживания было. Добавляло размер.
 

webmasterfree

Client
Регистрация
03.02.2019
Сообщения
116
Благодарностей
17
Баллы
18
Вот гадость не приятная. Нашел вот такой вот код, но он работает так:
Оригинальное изображение остаётся и создаётся новое изображение, сжатое по качеству с тем же именем и размерами, в директории проекта в папке Temp

C#:
string filePath = project.Variables["filePath"].Value; // путь к файлу из переменной проекта
string directory = project.Directory + @"\Temp\"; // директория нового файла
string newFilePath = directory + Path.GetFileName(filePath); // путь к новому файлу

// Проверяем существование директории
if (!Directory.Exists(directory))
    // Если директория не существует, то создаём
    Directory.CreateDirectory(directory);

// Создаем объект Image из файла с изображением
Image img = Image.FromFile(filePath);
// Задаем mime-тип (кодек изображения)
string mimeType = @"image/jpeg";
// Создаем объект, содержащий информацию о кодировке файла
ImageCodecInfo ici = null;
// Получаем кодеки для всех форматов изображений (Получаем список доступных кодеков)
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
// Находим нужный кодек изображения (image/jpeg)
foreach (ImageCodecInfo codec in codecs) {
    if (codec.MimeType == mimeType)
        ici = codec;
}
// Создаем объект с параметрами
EncoderParameters ep = new EncoderParameters(1);
// 100L (75L, 50L) - степень качества (чем меньше, тем меньше весит изображение и меньше качество)
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L);
// Сохраняем изображение в заданной кодировке и с заданными параметрами
img.Save(newFilePath, ici, ep);
// Освобождаем все ресурсы, используемые объектом Image
img.Dispose();

// Возвращаем путь к новому файлу
return newFilePath;

Так как в С# не сильно силен - можете помочь, пожалуйста, отредактировать этот код, только чтобы он не копировал, а заменял текущее изображение?
 
  • Спасибо
Реакции: Evgeny76

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 943
Благодарностей
4 339
Баллы
113
C#:
File.Move(newFilePath, filePath);
Но по-моему, в коде выше нужно удалить все строки с созданием новых директорий и просто перезаписать файл
Код:
img.Save(filePath, ici, ep);
 

webmasterfree

Client
Регистрация
03.02.2019
Сообщения
116
Благодарностей
17
Баллы
18
Блин что то не получается у меня. Пишет ошибку:
Выполнение действия CSharp OwnCode. The path is not of a legal form.
Директиву using тоже добавил.
41919
 

webmasterfree

Client
Регистрация
03.02.2019
Сообщения
116
Благодарностей
17
Баллы
18
Итак, получилось сделать так, чтобы создался файл с меньшим размером.
Но вот как сделать чтоб он поменялся - я не совсем понял.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 943
Благодарностей
4 339
Баллы
113

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