У меня есть квадратная картинка, края которой я хотел бы закруглить. Я сделал это с помощью System Bitmap и GraphicsPath, но здесь все по-другому. Пример фото
Напишите обычный прямоугольник
Может быть, я думаю неправильно, и это максимально просто. Я пробовал гуглить, но ничего точного не нашел. Я видел разные способы через маску и эффект, но я не уверен. Может кто подскажет буду очень признателен, я только начал свой путь.
Код, который я использую для обрезки углов изображения в С#.
public static Image RoundCorners(string fileName, int cornerRadius)
{
var image = CreateImageFromGame(fileName); //Получаем растр
if (image is not null)
{
cornerRadius *= 2;
Bitmap roundedImage = new(image.Width, image.Height);
GraphicsPath gp = new();
gp.AddArc(0, 0, cornerRadius, cornerRadius, 180, 90);
gp.AddArc(0 + roundedImage.Width - cornerRadius, 0, cornerRadius, cornerRadius, 270, 90);
gp.AddArc(0 + roundedImage.Width - cornerRadius, 0 + roundedImage.Height - cornerRadius, cornerRadius, cornerRadius, 0, 90);
gp.AddArc(0, 0 + roundedImage.Height - cornerRadius, cornerRadius, cornerRadius, 90, 90);
using (Graphics gr = Graphics.FromImage(roundedImage))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.SetClip(gp);
gr.DrawImage(image, 0, 0, image.Width, image.Height);
}
return roundedImage;
}
return null;
}
Конкретные действия, которые я должен попробовать или закодировать
@MichaelChourdakis Не могли бы вы посоветовать мне, где я могу посмотреть на это более подробно и яснее? Чтобы лучше понять, что вы подразумеваете под "ID2D1Effect с шейдером"
это не легко. Вы должны использовать ID2D1DeviceContext в качестве цели рендеринга, которая может создавать эффекты. Затем вам нужно создать собственный эффект (learn.microsoft.com/en-us/windows/win32/direct2d/custom-effects ), передав шейдер, который это делает. Вам нужно больше узнать о HLSL и тому подобном.
Не уверен, что вы имеете в виду именно «скругление краев», вам нужен эффект виньетки? learn.microsoft.com/en-us/windows/win32/direct2d/… или опубликуйте входные и желаемые выходные изображения
Хотите ли вы нарисовать контур указанного прямоугольника со скругленными углами? Если это так, я предлагаю вам попробовать использовать угол ID2D1RenderTarget::DrawRoundedRect
@SimonMourier Я добавил пример, который использую для обрезки углов в С#. Возможно ли что-то подобное на D2D1?
Можете ли вы поместить изображение того, что вы ожидаете, ввод и вывод?
@SimonMourier Да, я добавил картинки. Как видите, углы были закруглены.
@SimonMourier Может быть, мне нужно сделать пиксели в углах изображения прозрачными, чтобы добиться эффекта закругленного изображения? Если да, не могли бы вы помочь, как я могу сделать это в D2D1?
Это должно быть выполнимо, у вас есть ID2D1Bitmap или IWicBitmapSource в качестве входных данных? Какой язык?
@SimonMourier Да, я получаю его прямо из игры и могу конвертировать в эти форматы. Пишу на c# с помощью WinAPI dll, но перекинуть что-то с c++ на c# не проблема. На данный момент я получаю System Bitmap и выполняю код, который я написал выше «RoundCorners». Могу ли я сделать это на D2D1Bitmap или IWicBitmapSource?
Вы можете попробовать использовать методы DrawRoundedRectangle и FillRoundedRectangle, чтобы обвести и заполнить прямоугольник со скругленными углами.
Вы можете попробовать использовать ID2D1Bitmap для создания растровой кисти. Затем вы можете использовать растровую кисть, чтобы заполнить прямоугольник со скругленными углами.
Вы можете обратиться к документам:
@Aloex У вас есть новости по этой проблеме? Не могли бы вы проверить мой ответ?
Вы должны использовать ID2D1Effect с шейдером.