Прежде всего, я хотел бы сказать, что я очень мало знаю об именах имен в пространстве.Net.
У меня есть два байтовых массива данных изображения, которые я хотел бы объединить в растровое изображение для кнопки WPF. Я хотел бы сделать все это в коде С#. Фоновое изображение представляет собой либо jpeg, либо png, а оверлейное изображение, безусловно, представляет собой png с прозрачными областями. Оверлейное изображение является одним из баннеров "Продано", которые я хотел бы добавить к исходному изображению. У меня есть функция, которая преобразует любое изображение в то, что будет обрабатывать button.background.
Я пробовал это для обоих изображений, и он работает отлично. Следующая часть - это часть из-за моего незнания обработки изображений в.Net, которая меня озадачила. Я видел что-то о RenderTargetBitmap, но мне не удалось понять, как получить базовую/фоновое растровое изображение в нем, чтобы отобразить второй сверху, возможно, есть другой способ сделать это. Здесь копия функции, которую я унаследовал от предыдущего кодера/проекта.
Я должен взять массив байтов и преобразовать его в то, что я могу назначить непосредственно на button.background:
public static BitmapImage ByteArrayToImageBrush(this byte[] imageData)
{
if (imageData == null || imageData.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
Я определил новый класс, который наследуется от кнопочного вызова CategoryButton, у которого есть еще одна ошибка. свойства. Я могу успешно разместить любое изображение в качестве фона для кнопки, когда создаю кнопки в коде со следующим:
CategoryButton catbtn = new CategoryButton();
catbtn.Background = new ImageBrush(ByteArrayToImageBrush(bgImageByteArray);
// * or *
catbtn.Background = new ImageBrush(ByteArrayToImageBrush(overlayImageByteArray);
Поэтому я знаю, что эта функция работает достаточно хорошо. Но как получить либо массив байтов, либо результирующий ImageBrush во что-то, что я могу "добавить"/объединить второе оверлейное изображение, а затем передать его в формат, который можно использовать для фона кнопки? Я знаю, что это большой вопрос, но я в тупике, и я и разочаровываюсь, пытаясь понять это!
Самый простой способ - разместить два элемента управления Image
:
<Grid>
<Image Name="image" Stretch="None" />
<Image Name="overlay" Stretch="None" />
</Grid>
И просто назначьте соответствующий ImageSource
Source
каждого элемента управления.
Если вам действительно нужно объединить два изображения в один, вы можете сделать что-то вроде этого:
private static ImageSource CombineImageWithOverlay(byte[] imageBytes, byte[] overlayBytes)
{
var image = GetImageFromBytes(imageBytes);
var overlay = GetImageFromBytes(overlayBytes);
var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
context.DrawImage(image, new Rect(0, 0, image.PixelWidth, image.PixelHeight));
context.DrawImage(overlay, new Rect(0, 0, overlay.PixelWidth, overlay.PixelHeight));
}
var result = new RenderTargetBitmap(image.PixelWidth, image.PixelHeight, image.DpiX, image.DpiY, PixelFormats.Pbgra32);
result.Render(visual);
return result;
}
private static BitmapImage GetImageFromBytes(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
var img = new BitmapImage();
img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad;
img.StreamSource = stream;
img.EndInit();
return img;
}
}