JpegBitmapEncoder/RenderTargetBitmap — чрезмерная резкость с .net 2 по сравнению с 4.7.2
Я работаю над переносом устаревшей системы ASP.Net/C# в Azure. Первоначально просто меняем минимально возможную сумму, но часть этого переходит на обновленную платформу .Net (2/3/3.5 => 4.7+)
Частью этого является инструмент, который создает превью изображений в разных размерах, добавляет водяные знаки, затем повышает резкость, а затем сохраняет их.
Если бы клиент жаловался, что новые изображения слишком резкие.
После долгих экспериментов - обнаружил, что когда я исключаю дополнительный код повышения резкости (Aforge.Imaging), поэтому ничего не делается - результаты без резкости .Net 4.7.2 НАМНОГО острее, чем / Net 2
Я разработал копии программы, которые сделали минимум - как в .Net 4.7.2, так и в 2.0, один и тот же код - и изображения сильно отличаются.
Я предполагаю, что что-то изменилось в рамках?
Можно ли немного уменьшить резкость?
В принципе, некоторая резкость хороша, но это зашло слишком далеко.
Код использует потенциально необычный путь для создания превью, поскольку в других областях (не в тестовой программе) он выполняет манипуляции с метаданными/цветовым пространством, плюс он довольно старый. В основном используется System.Windows.Media.Imaging
К вашему сведению, качество изображения составляет 75 точек на дюйм, а размер изображения – 72. Размер изображения – 320.
Основные (не все) тестовые программы:
imageStream = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
BitmapDecoder decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
myBitmapSource = decoder.Frames[0];
....
BitmapFrame myBitmapSourceFrame = (BitmapFrame)myBitmapSource;
destColorContext = new ColorContext(new Uri(iccTargetProfile));
ColorContext sourceColorContext;
try
{
sourceColorContext = myBitmapSourceFrame.ColorContexts[0];
}
catch (Exception Err)
{//If no inbuilt profile then default to AdobeRGB
sourceColorContext = new ColorContext(new Uri(iccDefaultProfile)); ;
}
ColorConvertedBitmap ccb = new ColorConvertedBitmap(myBitmapSource, sourceColorContext, destColorContext, PixelFormats.Pbgra32);
myBitmapSource = ccb;
....
double nPercent = ScalePercentage(myBitmapSource.PixelHeight, myBitmapSource.PixelWidth, imgSize, imgSize);
int newHeight = Convert.ToInt16((double)myBitmapSource.PixelHeight * nPercent);
int newWidth = Convert.ToInt16((double)myBitmapSource.PixelWidth * nPercent);
//resize by re-drawing onto new Bitmap
RenderTargetBitmap rtBitmap = new RenderTargetBitmap(
newWidth /* PixelWidth */,
newHeight /* PixelHeight */,
imageDPI /* DpiX */,
imageDPI /* DpiY */,
PixelFormats.Default);
DrawingVisual drawVisual = new DrawingVisual();
using (DrawingContext dc = drawVisual.RenderOpen())
{
dc.DrawRectangle(new ImageBrush(myBitmapSource), null /* no pen */,
new Rect(0, 0, rtBitmap.Width, rtBitmap.Height));
rtBitmap.Render(drawVisual);
//WATERMARK STUFF HERE
//Previous Sharpening stuff HERE
List<ColorContext> colorContexts = new List<ColorContext>();
colorContexts.Add(destColorContext);
//encoder
JpegBitmapEncoder output = new JpegBitmapEncoder();
output.QualityLevel = imageQuality;
//output.Frames.Add(BitmapFrame.Create(outFrame));
output.Frames.Add(BitmapFrame.Create(rtBitmap, null, null, new System.Collections.ObjectModel.ReadOnlyCollection<ColorContext>(colorContexts)));
string endImage = folderDest + fileNameOnly;
using (FileStream saveFileStream = new FileStream(endImage, FileMode.Create, FileAccess.Write))
{
output.Save(saveFileStream);
}
Итак, две картинки - без резкости с использованием одного и того же кода для их создания....
Надоедливый ....