Я работаю над программой Windows 8 XAML-C ++.
Я отображаю изображение так:
<Grid>
<Image Source="myImage.png"/>
</Grid>
Когда пользователь касается его, я хочу скрыть область вокруг точки касания. Мне также нужно знать, когда все изображение было скрыто пользователем. Я бы предпочел не разрезать свое изображение на множество квадратов.
С помощью XNA (в приложении для Windows Phone, которое я опубликовал ранее) я отображал изображение с помощью Texture2D и использовал переменную Color [], чтобы изменять его попиксельно:
Color[] pixelsTexture;
(...)
this.pixelsTexture[i] = newColor;
(...)
Texture2D tex = new Texture2D(GraphicDevice, this.texture.Width, this.texture.Height);
tex.SetData(this.pixelsTexture);
this.texture = tex;
Но здесь мне нужно сделать изображение прозрачным, чтобы пользователь шаг за шагом раскрывал изображение ниже.
У меня есть простой способ (я имею в виду: без использования DirectX) модифицировать изображение, не используя XNA?
РЕДАКТИРОВАТЬ 2:
Я вижу 🙂 В этом случае я бы просто пошел на модификацию текстуры во время выполнения. Вам не нужен DirectX, так как вы можете использовать GDI + для редактирования изображений на уровне пикселей. Вы бы использовали точку касания, чтобы идентифицировать центральный пиксель вашей операции «скрытия» и взять несколько пикселей вокруг него, чтобы установить их Color.a
значения до 0.
РЕДАКТИРОВАТЬ :
Итак, основываясь на вашем комментарии, я думаю, что вы хотите, чтобы пользователь скрывал все изображение, щелкая там, где он или она хочет.
Вы упомянули, что не хотите разрезать изображение на квадраты. Хорошо, что вы можете сделать, это сегментировать область изображения в сетку. Не буквально, просто посчитайте, как ячейки сетки будут расположены над изображением, если оно будет расположено прямо над ним.
Например, изображение размером 256 x 256 может быть покрыто сеткой, скажем, 32 x 32 невидимых ячеек. Это дает нам сетку 8 х 8.
Теперь, когда у нас есть сетка, вычислить размеры каждой ячейки относительно просто. Вы просто используете массив Rect
структуры для представления ваших ячеек сетки.
Когда пользователь касается изображения, вы можете использовать местоположение касания, чтобы выяснить, к какой ячейке сетки прикоснулись, сравнивая точки касания с верхней левой и нижней правой точками каждой ячейки сетки. Вы делаете это до тех пор, пока не получите ячейку, левая верхняя точка которой «меньше», а правая нижняя точка «больше», чем ваша точка касания.
Теперь, когда вы знаете, к какой невидимой ячейке прикоснулись, все, что вам нужно сделать, это нарисовать «скрытую» текстуру непосредственно над ячейкой, что удобно Rect
состав 🙂
Это так просто. Конечный результат будет точно таким, как если бы вы разрезали текстуру на кучу плиток.
На мой взгляд, это будет намного быстрее во время выполнения и проще в реализации, чем резак текстур и т. Д.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Я думаю, что подход к изменению текстуры является излишним. Это внесет ненужные издержки для обновлений peprixel.
Лично я бы наложил текстуру нужного размера и формы в точке касания. Текстура может быть полупрозрачной или непрозрачной, выбор за вами.
Конечный результат будет точно таким же, как наложенная текстура покроет / скроет изображение в точке касания. Самое приятное, что вам не нужны никакие другие библиотеки, чтобы это работало.
если вы хотите сделать текстуру прозрачной, вам нужно установить цвет на Color.Transparent
В моем случае я должен был сделать что-то похожее на ваш случай — у меня было изображение, и мне нужно было нарисовать границу прямо за спрайтом, оставив исходный спрайт видимым. Я достиг этого, динамически создавая Texture2D
объект, который имел одинаковую ширину + 2 и одинаковую высоту + 2 исходного спрайта (+2 для рисования границы прямо за пределами исходного спрайта, один пиксель слева, справа, сверху и снизу). Установите новый цвет спрайта Color.Transparent
а затем нарисуйте границу.
В вашем случае это немного проще. Вы динамически создаете спрайт со сплошным цветом, а затем, когда пользователь прикасается к спрайту, устанавливаете Цвет в Прозрачный.
Код ниже устанавливает спрайт прозрачным (у меня сейчас нет доступа к VS, поэтому у кода могут быть проблемы с форматированием / грамматикой). Если вы поместите этот код в функцию, вы можете динамически переключать его между прозрачным и нет.
for (int i=0; i<this.pixelsTexture.Count; i++)
{
this.pixelsTexture[i] = Color.Transparent;
}
tex.SetData(this.pixelsTexture);
РЕДАКТИРОВАТЬ: я заметил, что вы пишете на C ++, мой код на C #, но я думаю, что он будет работать, хотя.