Растровое изображение увеличивает размер tif после достижения определенной точки
Я использую растровое изображение для водяного знака файлов изображений tif после того, как он достигает номера файла 440, размер изображения увеличивается, что приводит к появлению небольшого текстового водяного знака. Мой метод предназначен для обработки большого количества файлов, он также проверяет, окрашено ли изображение или нет, и обрабатывает его соответствующим образом. Любые предложения о том, что я должен попробовать. Я не знаю, почему это происходит. первоначальный размер: 2480 x 3580
большой размер: 5250 x 7497
Что я уже пробовал:
public void waterMark(string euroPrefix, string resultedTifFolders, string waterMarkedTif) { using (Brush brush = new SolidBrush(Color.Black)) { using (Font font = new Font("Arial", 50, GraphicsUnit.Pixel)) { using (Bitmap original_bitmap = new Bitmap(resultedTifFolders)) { int compressionTagIndex = Array.IndexOf(original_bitmap.PropertyIdList, 0x103); PropertyItem compressionTag = original_bitmap.PropertyItems[compressionTagIndex]; byte[] com = compressionTag.Value; Encoder encoder = Encoder.Compression; EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(encoder, (long)EncoderValue.CompressionCCITT4); myEncoderParameters.Param[0] = myEncoderParameter; ImageCodecInfo myImageCodecInfo; myImageCodecInfo = GetEncoderInfo("image/tiff"); SizeF euroPrefixSize; if (new[] { 5, 7 }.Contains(com[0])) { using (Graphics tempGraphics = Graphics.FromImage(original_bitmap)) { euroPrefixSize = tempGraphics.MeasureString(euroPrefix, font); } using (Bitmap new_bitmap = new Bitmap(original_bitmap.Width, original_bitmap.Height + (int)euroPrefixSize.Height + 10)) { new_bitmap.SetResolution(original_bitmap.HorizontalResolution,original_bitmap.VerticalResolution); using (Graphics graphics = Graphics.FromImage(new_bitmap)) { graphics.FillRectangle(Brushes.White, 0, 0, original_bitmap.Width, original_bitmap.Height + 100); graphics.DrawImage(original_bitmap, 0, 0, original_bitmap.Width, original_bitmap.Height); Point position = new Point(original_bitmap.Width - ((int)euroPrefixSize.Width + 200), original_bitmap.Height + 5); graphics.DrawString(euroPrefix, font, brush, position); new_bitmap.Save(waterMarkedTif, /*ImageFormat.Tiff,*/ myImageCodecInfo, myEncoderParameters); new_bitmap.Save(waterMarkedTif, ImageFormat.Tiff); } } return; } else { Bitmap tempBitmap = new Bitmap(original_bitmap.Width, original_bitmap.Height); using (Graphics tempGraphics = Graphics.FromImage(tempBitmap)) { euroPrefixSize = tempGraphics.MeasureString(euroPrefix, font); } tempBitmap = new Bitmap(original_bitmap.Width, original_bitmap.Height + (int)euroPrefixSize.Height + 10); tempBitmap.SetResolution(original_bitmap.HorizontalResolution,original_bitmap.VerticalResolution); using (Graphics graphics = Graphics.FromImage(tempBitmap)) { graphics.FillRectangle(Brushes.White, 0, 0, original_bitmap.Width, original_bitmap.Height + 100); graphics.DrawImage(original_bitmap, 0, 0, original_bitmap.Width, original_bitmap.Height); Point position = new Point(original_bitmap.Width - ((int)euroPrefixSize.Width + 200), original_bitmap.Height + 5); graphics.DrawString((euroPrefix), font, brush, position); tempBitmap.Save(waterMarkedTif, ImageFormat.Tiff); } } } } } }
Daniele Rota Nodari
Я бы проверил эффекты "SetResolution", в случае отсрочки его вызова или попытки избежать его.
Переменная myEncoderParameters-еще один кандидат.
В additon я бы переместил все вызовы "Save" из блоков "using (Graphics)" (это также позволило бы переместить SetResolution между использованием блока и сохранением вызова).
AskalotLearnalot
Спасибо, я займусь этим. Что касается использования и сохранения, то я сделал это таким образом, потому что GDI не хватает места, когда я редактирую большое количество файлов за один раз.
Daniele Rota Nodari
Да, как вы уже сделали, утилизация графических объектов важна для сокращения использования ресурсов, и "использование" - это простой способ обеспечить это.
Это еще одна причина, чтобы переместить "сохранить" из "использования", чтобы избавиться от графических объектов, как только они больше не нужны.
Вы можете переместить перед любым блоком "using" любую инструкцию, которая не взаимодействует с графическим объектом, выделенным этим "using"; это также может помочь в рефакторинге кода, переместив некоторый код в новые, специализированные методы (например: есть 2 блока "using(Graphics....", которые кажутся почти идентичными друг другу).
Последнее: using/Dispose отсутствуют для tempBitmap; обратите внимание на это, потому что этой переменной назначены два новых объекта Bitmap.