Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.87/23: Рейтинг темы: голосов - 23, средняя оценка - 4.87
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
1

Аналоги типа Bitmap из Windows Forms в WPF

09.11.2014, 22:26. Просмотров 4499. Ответов 20
Метки нет (Все метки)

Раньше сидел на windows form, решил перейти на wpf, и как узнал там нет Bitmap на котором построена моя программа ... Хотелось бы узнать есть что-нибудь аналогичное в wpf с методами getPixel и setPixel?
Не мало потратил времени в поисках этой проблемки, и в мсдн(System.Windows.Media) искал и в яндексе и на форуме, но ничего аналогичного не бросилось ... Может у кого то аналогичная проблема была
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2014, 22:26
Ответы с готовыми решениями:

Элемент, похожий на Bitmap из Windows Forms
Всем привет, тут у меня такое дело появилось: я хочу создать список картинок,...

Функции создания окна\аналоги Windows Forms
Есть ли библиотеки, содержащие более широкие возможности по созданию окна....

WPF и Windows Forms
Знакомый спросил моего мнения относительно того, что в плане дальнейших...

Windows Forms и WPF??
Здраствуйте! Возможно, мой вопрос будек для кого-то слишком некорректным, но я...

WPF Форма в Windows Forms
Есть форма сделанная на WPF, как можно ее портировать на WinForms

20
Kazbek17
https://vk.com/a.tsarev83
52 / 57 / 21
Регистрация: 06.02.2012
Сообщений: 230
10.11.2014, 00:44 2
А чем вас не устраивает класс WriteableBitmap?
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
10.11.2014, 01:10  [ТС] 3
По сравнению со старым Bitmap-ом, этот в разы сложнее!! нет ли более упрощённого?!

Добавлено через 5 минут
Там я не нашёл получение и установку по одному пикселю, да и не понятно как это всё работает, очень сложно сделано, охото старый добрый bitmap
Может как то можно его вытащить из какого нибудь dll
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
10.11.2014, 02:41 4
Цитата Сообщение от v13z91 Посмотреть сообщение
Там я не нашёл получение и установку по одному пикселю, да и не понятно как это всё работает, очень сложно сделано, охото старый добрый bitmap
Может как то можно его вытащить из какого нибудь dll
Подключи к проекту библиотеку: System.Windows.Forms
Вот тебе небольшой хелпер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Drawing = System.Drawing;
 
namespace XXX.Utils.Graphic
{
    public class ImageHelper
    {
 
        /// <summary>
        /// Конвертирует System.Windows.Media.Imaging.BitmapImage в System.Drawing.Bitmap.
        /// </summary>
        /// <param name="bitmapImage">Изображение для конвертирования</param>
        /// <returns></returns>
        public static Drawing.Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
        {
            using (var outStream = new MemoryStream())
            {
                BitmapEncoder enc = new PngBitmapEncoder();
                enc.Frames.Add(BitmapFrame.Create(bitmapImage));
                enc.Save(outStream);
                var bitmap = new Drawing.Bitmap(outStream);
 
                return new Drawing.Bitmap(bitmap);
            }
        }
 
        /// <summary>
        /// Кисть, которую нужно преобразовать в System.Windows.Media.ImageSource
        /// </summary>
        /// <param name="brush">Кисть</param>
        /// <param name="size">Размер объекта</param>
        /// <param name="margin">Отступы</param>
        /// <param name="fileName">Имя файла, в который будет сохранено изображение в формате PNG</param>
        /// <returns></returns>
        public static ImageSource BrushToImageSource(Brush brush, Size size, Thickness margin, string fileName)
        {
            var bitmap = new RenderTargetBitmap(
                (int)(size.Width + margin.Left + margin.Right),
                (int)(size.Height + margin.Top + margin.Bottom),
                96, 96, PixelFormats.Pbgra32);
 
            var drawingVisual = new DrawingVisual();
            using (DrawingContext context = drawingVisual.RenderOpen())
            {
                var rect = new Rect(margin.Left, margin.Top, size.Width, size.Height);
                context.DrawRectangle(brush, null, rect);
            }
 
            bitmap.Render(drawingVisual);
 
            var encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bitmap));
 
            using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
            {
                encoder.Save(fs);
            }
 
            return bitmap;
        }
 
        /// <summary>
        /// Кисть, которую нужно преобразовать в System.Windows.Media.ImageSource
        /// </summary>
        /// <param name="brush">Кисть</param>
        /// <param name="size">Размер объекта</param>
        /// <param name="fileName">Имя файла, в который будет сохранено изображение в формате PNG</param>
        /// <returns></returns>
        public static ImageSource BrushToImageSource(Brush brush, Size size, string fileName)
        {
            return BrushToImageSource(brush, size, new Thickness(0d), fileName);
        }
 
        #region Конвертер форматов (BitmapSource в BitmapImage)
        /// <summary>
        /// Конвертировать BitmapSource в BitmapImage используя PngBitmapEncoder
        /// </summary>
        /// <param name="bitmapSource">BitmapSource который нужно конвертировать</param>
        /// <returns></returns>
        public static BitmapImage BitmapSourceToBitmapImage(BitmapSource bitmapSource)
        {
            var encoder = new PngBitmapEncoder();
            using (var ms = new MemoryStream())
            {
                var bImg = new BitmapImage();
                encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
                encoder.Save(ms);
                bImg.BeginInit();
                bImg.StreamSource = new MemoryStream(ms.ToArray());
                bImg.EndInit();
                return bImg;
            }
        }
        #endregion
    }
}
Добавлено через 2 минуты
Вот как конвертировать Bitmap в BitmapSource
http://www.codeproject.com/Articles/104929/Bitmap-to-BitmapSource
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
10.11.2014, 04:27  [ТС] 5
Цитата Сообщение от Casper-SC Посмотреть сообщение
System.Windows.Forms
У меня такого нет, у меня проект на wpf и выдаёт ошибку

Добавлено через 1 час 2 минуты
Ладно, давайте забудем о просто bitmap, и разберём как же пользоваться этим новым WriteableBitmap...
Как создать пустое изображение 10 на 10 пикселей и задать каждому пикселю свой цвет?
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
10.11.2014, 04:36 6
Кажись с просонья перепутал библиотеку. System.Drawing.dll нужно, а не формы

Добавлено через 41 секунду
Цитата Сообщение от v13z91 Посмотреть сообщение
У меня такого нет, у меня проект на wpf и выдаёт ошибку
С таким подходом к делу далеко не уедешь. Так и скажи, что лень заморачиваться, разбираться.

Добавлено через 1 минуту
Вот тебе статья.
http://professorweb.ru/my/WPF/graphics_and_animation/level14/14_5.php
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
10.11.2014, 04:37  [ТС] 7
Если честно сказать то я то что написано, вообще не догоняю!!
Цитата Сообщение от Casper-SC Посмотреть сообщение
Я как раз это прочитал!
Осталось понять как загрузить картинку, а не создать пустую, для разбора её по пикселям!
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
10.11.2014, 04:41 8
Скачай и посмотри это: http://writeablebitmapex.codeplex.com

Добавлено через 3 минуты
Цитата Сообщение от v13z91 Посмотреть сообщение
Осталось понять как загрузить картинку, а не создать пустую, для разбора её по пикселям!
По ссылке есть пример как. Внизу страницы.
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
10.11.2014, 04:41  [ТС] 9
Цитата Сообщение от Casper-SC Посмотреть сообщение
Скачай и посмотри это: http://writeablebitmapex.codeplex.com
А от туда нужно в свой проект вставить только dll файл? и куда? который в папке wpf
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
10.11.2014, 04:48 10
Цитата Сообщение от v13z91 Посмотреть сообщение
А от туда нужно в свой проект вставить только dll файл? и куда? который в папке wpf
Аналоги типа Bitmap из Windows Forms в WPF
Аналоги типа Bitmap из Windows Forms в WPF
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
10.11.2014, 04:49 11
Цитата Сообщение от v13z91 Посмотреть сообщение
Если можно, то лучше в скайпе или в асе связаться? буду благодарен!
Не сейчас только. Сейчас я спать )
1
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
10.11.2014, 08:08  [ТС] 12
Цитата Сообщение от Casper-SC Посмотреть сообщение
Не сейчас только. Сейчас я спать )
Библиотеку установил, спасибо!
Хотелось бы сохранить контакты для связи, а то хорошие советы мне не помешают!!!

Добавлено через 3 часа 14 минут
Цитата Сообщение от Casper-SC Посмотреть сообщение
Скачай и посмотри это: http://writeablebitmapex.codeplex.com
Нее, не помогло, не хочет ни как создавать картинку, и плюс ко всему там только относительный путь ... пробовал загружать через потом, и всё равно говорит что не хочет работать!
Кароче, нужно что то другое!!
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
10.11.2014, 14:06 13
Цитата Сообщение от v13z91 Посмотреть сообщение
Нее, не помогло, не хочет ни как создавать картинку
Цитата Сообщение от v13z91 Посмотреть сообщение
Кароче, нужно что то другое!!
Не пробовал проблему решать, а не пытаться искать что-то другое?

Цитата Сообщение от v13z91 Посмотреть сообщение
пробовал загружать через потом
Не понял.

Позже посмотрю, на работе завал.

Добавлено через 16 минут
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Window x:Class="Wpf_GridGenerator.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Width="787"
        Height="439"
        Loaded="Window_Loaded">
  <Grid>
    <Image x:Name="_image"
           Width="422"
           Height="289"
           Margin="46,59,0,0"
           HorizontalAlignment="Left"
           VerticalAlignment="Top" />
 
  </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Reflection;
using System.Windows;
using System.Windows.Media.Imaging;
 
namespace Wpf_GridGenerator
{
    public partial class MainWindow : Window
    {
        const string UriPack = "pack://application:,,,";
        readonly string ComponentUri = "/" + Assembly.GetExecutingAssembly().GetName().Name + ";component/";
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            BitmapImage bmp = new BitmapImage(new Uri(UriPack + ComponentUri + "Resources/Pictures/Screenshot_1.jpg", UriKind.Absolute));
            WriteableBitmap writeableBmp = new WriteableBitmap(bmp);
 
            _image.Source = writeableBmp;
        }
    }
}
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
10.11.2014, 16:17  [ТС] 14
Цитата Сообщение от Casper-SC Посмотреть сообщение
пробовал загружать через потом
Не понял.
Через поток!!! Stream

Добавлено через 11 минут
Цитата Сообщение от Casper-SC Посмотреть сообщение
Не пробовал проблему решать, а не пытаться искать что-то другое?
Я пытаюсь, но стандартными классами ... загружаю через BitmapImage, потом думаю перевести в BitmapSource, который и пойдёт в конструктор к WriteableBitmap, а там через методы CopyPixels и WritePixels попробую получать по одному пикселю и этого должно хватить чтобы заменить обычный Bitmap, только гораздо большим кол-вом кода! В идеале так! Но вот ещё проблемка, когда я загружаю картинку через BitmapImage, она у меня немного модифицируется, толи сглаживается толи ещё чего, но немного не тот результат чем начальный!

Делаю CaptchaReader, основная логика уже готова, но решил перенести в wpf, т к реализация более красивой формы, менее затратна в написании.
0
Ev_Hyper
Заблокирован
10.11.2014, 22:30 15
v13z91, почему вам не подошел System.Drawing.Bitmap из WinForm, как уже предлагали выше?
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
11.11.2014, 07:25  [ТС] 16
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
почему вам не подошел System.Drawing.Bitmap из WinForm, как уже предлагали выше?
Не знаю, я самый первый раз пробовал подключить это пространство имён, но его не нашёл visual studio, предложил мне создать пустой класс Bitmap и я подумал что в wpf нет старых библиотек классов!
На моё удивление, это и правда помогло!

Добавлено через 2 минуты
Сейчас у меня произошёл конфликт имён System.Windows.Media.Color и System.Drawing.Color, можно ли как то это по другому поправить, нежели чем прописывать один уровень: Drawing.Color qqq = new Drawing.Color();

Добавлено через 2 часа 20 минут
Вот такая вот запись будет правильной? Вроде ошибка пропала из visual studio
C#
1
2
3
using System.Drawing;
using System.Windows.Media;
using Color = System.Drawing.Color;
Добавлено через 4 минуты
Вопрос конечно актуален!
Но в том классе мне просто не нужно было подключать System.Windows.Media, так как он там не нужен!
Спасибо всем кто уделил моей проблеме внимание!
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
11.11.2014, 11:12 17
Цитата Сообщение от v13z91 Посмотреть сообщение
когда я загружаю картинку через BitmapImage, она у меня немного модифицируется, толи сглаживается толи ещё чего, но немного не тот результат чем начальный!
Результат сглаживания виден только при выводе в Image или реально в памяти картинка меняется?

Добавлено через 48 секунд
Хабр: Откуда «мыло» в WPF и как с ним бороться
Может чем-то поможет.
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
11.11.2014, 11:21  [ТС] 18
Цитата Сообщение от Casper-SC Посмотреть сообщение
Результат сглаживания виден только при выводе в Image или реально в памяти картинка меняется?
Скорей всего эта картинка подгоняется под объект на форме Image, под ширину, поэтому мне так показалось что она как то изменилась!

Добавлено через 3 минуты
Хорошая статья, спасибо! Будет время прочту!

Добавлено через 3 минуты
Вроде бы я со всем разобрался!
Даже нашёл как конвертировать Bitmap в BitmapSource, чтобы вставить в Image.Source
Кому интересно, вот код!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Media.Imaging;
 
namespace xxxxxxx
{
    // Взято отсюда [url]http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap[/url]
    static class BitmapConversion
    {
        public static Bitmap ToWinFormsBitmap(BitmapSource bitmapsource)
        {
            MemoryStream stream = new MemoryStream();
 
            BitmapEncoder enc = new BmpBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create(bitmapsource));
            enc.Save(stream);
 
            Bitmap tempBitmap = new Bitmap(stream);
 
            return new Bitmap(tempBitmap);
        }
 
        public static BitmapSource ToWpfBitmap(Bitmap bitmap)
        {
            MemoryStream stream = new MemoryStream();
            bitmap.Save(stream, ImageFormat.Bmp);
            stream.Position = 0;
 
            BitmapImage result = new BitmapImage();
            result.BeginInit();
            result.CacheOption = BitmapCacheOption.OnLoad;
            result.StreamSource = stream;
            result.EndInit();
            result.Freeze();
 
            return result;
        }
    }
}
0
Casper-SC
Эксперт .NET
3620 / 1829 / 355
Регистрация: 27.03.2010
Сообщений: 5,139
Записей в блоге: 1
11.11.2014, 15:04 19
Цитата Сообщение от v13z91 Посмотреть сообщение
Даже нашёл как конвертировать Bitmap в BitmapSource, чтобы вставить в Image.Source
Кому интересно, вот код!
Только поспорил бы с преждевременной необходимостью в этом: result.Freeze();
0
v13z91
2 / 2 / 2
Регистрация: 09.11.2014
Сообщений: 58
11.11.2014, 15:06  [ТС] 20
Цитата Сообщение от Casper-SC Посмотреть сообщение
Только поспорил бы с преждевременной необходимостью в этом: result.Freeze();
Я не сильно понимаю для чего это, но решил оставить как есть!
0
11.11.2014, 15:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2014, 15:06

Windows Forms или WPF?
Добрый день! У меня есть необходимость написать некую корпоративную CRM...

Взаимодействие WPF, Windows Forms и Windows XP
Товарищи! Всю голову сломал, выручайте. Если приложение на нетфреймворке 4 на...

UserControl Windows Forms в WPF приложении
Добрый вечер,имеется UserControl содержащий ряд элементов Windows Forms я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru