a{return a*a;};
Компиляция с:
gcc -D"a=main()" so.c
Расширяется до:
main() {
return main()*main();
}
Попробуйте:
graphic.CompositingMode = CompositingMode.SourceCopy;
Это потому, что выборка была сделана с краев фотографии.
Как следующее работает для вас? Это код, который я использовал для того же. Основное различие, которое я замечаю, заключается в том, что я не использую SetResolution (и предполагаю, что ввод и вывод квадратные, поскольку это было для меня).
/// <summary>
/// Resizes a square image
/// </summary>
/// <param name="OriginalImage">Image to resize</param>
/// <param name="Size">Width and height of new image</param>
/// <returns>A scaled version of the image</returns>
internal static Image ResizeImage( Image OriginalImage, int Size )
{
Image finalImage = new Bitmap( Size, Size );
Graphics graphic = Graphics.FromImage( finalImage );
graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
Rectangle rectangle = new Rectangle( 0, 0, Size, Size );
graphic.DrawImage( OriginalImage, rectangle );
return finalImage;
}
Это из-за сглаживания (смешивания с фоном) краев при рисовании изображения.
Вы могли бы нарисовать его дважды, один раз без и один со сглаживанием включен. Или вы можете нарисовать его немного больше. Или, если известен исходный цвет фона, вы можете сначала заполнить изображение цветом фона.