Попытка объединить два байтовых массива данных изображения в одну битовую карту для кнопки WPF

1

Прежде всего, я хотел бы сказать, что я очень мало знаю об именах имен в пространстве.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 во что-то, что я могу "добавить"/объединить второе оверлейное изображение, а затем передать его в формат, который можно использовать для фона кнопки? Я знаю, что это большой вопрос, но я в тупике, и я и разочаровываюсь, пытаясь понять это!

Теги:
wpf
image
processing
bitmap

1 ответ

0
Лучший ответ

Самый простой способ - разместить два элемента управления 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;
    }
}
  • 0
    Извините за задержку ... но с тем, что вы дали мне, я собирался кое-что выяснить ... Это работает так, как мне нужно, не так Спасибо ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню