Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2013, 16:56   #1
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию (WPF) WriteableBitmap, проблема с CopyPixels

Пишу лабораторную по компьютерной графике, тема "Заполнение сплошных областей".

Развертку фигуры для заполнения и само заполнение делаю попиксельно. Для этого использую WriteableBitmap, который отображаю на Image.
Проблемы быстродействия на данный момент не являются первостепенными. Вопрос в другом.

Вот урезанный код используемого мной класса:
Код:
private class Color
{
	public byte[] Data { get; private set; }

	void ColorInstance(byte R, byte G, byte B, byte alpha)
	{
		Data = new byte[4];
		Data[0] = B;
		Data[1] = G;
		Data[2] = R;
		Data[3] = alpha;
	}
	public Color(byte R, byte G, byte B, byte alpha)
	{	ColorInstance(R, G, B, alpha); }
	public Color(byte R, byte G, byte B)
	{ ColorInstance(R, G, B, 255); }

	public static bool operator ==(Color color, Color color2)
	{
		return (color.Data == color2.Data);
	}
	public static bool operator !=(Color color, Color color2)
	{
		return (color.Data != color2.Data);
	}
}

private class FuseableBitmap
{
public readonly WriteableBitmap Bitmap;
private readonly int stride;
private readonly Color brushColor;

public FuseableBitmap(Image Sourсe, Color color)
{
	Bitmap = new WriteableBitmap((int)Sourсe.Width, (int)Sourсe.Height, 96, 96, PixelFormats.Bgra32, null);

	stride = Bitmap.PixelWidth * (Bitmap.Format.BitsPerPixel / 8);
	var mod = stride % 4; 
	if (mod != 0) stride += 4 - mod;

	brushColor = color;
}

public void PutPixel(int x, int y, Color color)
{
	if (x >= 0 && x < Bitmap.Width &&
			y >= 0 && y < Bitmap.Height)
		Bitmap.WritePixels(new Int32Rect(x, y, 1, 1), color.Data, stride, 0);
	else return;
}

public bool IsColored(int x, int y, Color color, Color newColor)
{
	if (x >= 0 && x <= Bitmap.Width &&
			y >= 0 && y <= Bitmap.Height)
	{
		byte[] colorData = new byte[4];
		Bitmap.CopyPixels(new Int32Rect(x, y, 1, 1), colorData, stride, 0);
		return (color.Data == colorData || newColor.Data == colorData);
	}
	else return true;
}
}
Проблема в двух моментах.

1. Почему-то каждый пиксель выводится как 2 вертикально расположенных пикселя.


2. Не могу получить цвет пикселя.
После использования функции
Код:
Bitmap.CopyPixels(new Int32Rect(x, y, 1, 1), colorData, stride, 0);
в colorData оказывается { 0, 0, 0, 0}, хотя, считываю значение белого пикселя.
Самостоятельно этот пиксель я не устанавливал, возможно поэтому у него все значения по нулям, следовательно он черный, но из-за того, что прозрачность полная, он отображается как белый.
Если я прав, то как мне заранее заполнить все пиксели белым?
Если нет, то, что я делаю не так?

Заранее всем спасибо.

Последний раз редактировалось O'neeL; 16.10.2013 в 16:58.
O'neeL вне форума Ответить с цитированием
Старый 17.10.2013, 13:17   #2
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию РЕШЕНИЕ

Все решилось заменой своих велосипедов на решения из библиотеки WriteableBitmapex. Она содержит много удобных функций для работы с WriteableBitmap.
O'neeL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 15:00
WPF на XP Strangers C# (си шарп) 5 04.06.2013 08:31
WPF и С# Митовей C# (си шарп) 1 12.11.2012 18:06
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10
Отображение картинки на кнопке WPF. Загрузка картинки из ресурсов. Проблема с Uri. Casper-SC Общие вопросы .NET 0 27.06.2010 23:11