Member 11266633 Ответов: 1

Добавление водяного знака увеличение размера изображения


Я использую класс из этой статьи Использование тригонометрии и Пифагора для водяного знака изображения[^]
Все работают хорошо, но после нанесения водяного знака размер изображения сильно увеличивается. Если входной файл имеет размер 144 КБ - в ouptut он увеличивается до 640 КБ. Почему это так?
public class WaterMark {
  private string waterMarkText;
  private string fontName;
  private FontStyle fontStyle;
  private Color color;
  private int maxFontSize;

  public WaterMark(string waterMarkText,
   string fontName, int maxFontSize,
   FontStyle fontStyle, Color color,
   byte alpha) {
   this.waterMarkText = waterMarkText;
   this.fontName = fontName;
   this.fontStyle = fontStyle;
   this.color = Color.FromArgb(alpha, color);
   this.maxFontSize = maxFontSize;
  }

  public Bitmap Apply(string url) {
   Bitmap bmp;
   using(Bitmap newBitmap = new Bitmap(url))
   using(Graphics g = Graphics.FromImage(newBitmap)) {
    double tangent = (double) newBitmap.Height /
     (double) newBitmap.Width;


    double angle = Math.Atan(tangent) * (180 / Math.PI);

    double halfHypotenuse = Math.Sqrt((newBitmap.Height * newBitmap.Height) +
     (newBitmap.Width *
      newBitmap.Width)) / 2;

    StringFormat stringFormat = new StringFormat();
    stringFormat.Alignment = StringAlignment.Center;
    stringFormat.LineAlignment = StringAlignment.Center;

    Font font = new Font(fontName, maxFontSize,
     fontStyle);
    for (int i = maxFontSize; i > 0; i--) {
     font = new Font(fontName, i, fontStyle);
     SizeF sizef = g.MeasureString(waterMarkText,
      font, int.MaxValue);

     double sin = Math.Sin(angle * (Math.PI / 180));
     double cos = Math.Cos(angle * (Math.PI / 180));

     double opp1 = sin * sizef.Width;
     double adj1 = cos * sizef.Height;

     double opp2 = sin * sizef.Height;
     double adj2 = cos * sizef.Width;

     if (opp1 + adj1 < newBitmap.Height &&
      opp2 + adj2 < newBitmap.Width) {
      break;
     }
    }

    g.SmoothingMode = SmoothingMode.None;
    g.RotateTransform((float) angle);
    g.DrawString(waterMarkText, font,
     new SolidBrush(color),
     new Point((int) halfHypotenuse, 0),
     stringFormat);

    bmp = new Bitmap(newBitmap);
    newBitmap.Dispose();

   }

   return bmp;
  }

 }


Что я уже пробовал:

Я пытаюсь использовать этот код, но он мне не помогает.

1 Ответов

Рейтинг:
0

OriginalGriff

Поскольку вы не показываете нам, где вы сохраняете файл, мы не можем быть уверены, в каком формате вы его сохраняете - и это имеет огромное значение для размера файла и, вероятно, связано с вашей проблемой.
Если, например, входной файл JPG, и вы сохраните его как BMP, то он резко увеличится в размере, даже если вы не измените изображение - потому что JPG-это сжатый формат, а BMP-нет.

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

И имейте в виду, что если вы редактируете JPG-файлы, вы будете терять качество изображения каждый раз, когда сохраняете его, так как JPG (как и некоторые другие форматы) - это сжатие с потерями, которое отбрасывает информацию. 5 или 6 итераций редактирования-сохранения могут почти полностью уничтожить изображение, если вы не будете осторожны.