2014-02-13 11 views
1

저는 Windows 8 XAML-C++ 프로그램에서 작업합니다. 이 같은 이미지를 표시 : 텍스처를 로컬에서 수정하는 방법은 무엇입니까?

<Grid> 
    <Image Source="myImage.png"/> 
</Grid> 

사용자가 닿을

, 내가 감동 지점 주변을 숨기려. 또한 사용자가 전체 이미지를 숨길 때도 알 필요가 있습니다. 나는 많은 사각형으로 내 이미지를 자르지 않는 것을 선호한다. (내가 전에 발표 된 윈도우 폰 응용 프로그램에) XNA와 , 나는 Texture2D를 사용하여 이미지를 표시, 나는 픽셀에 의해 그것을 픽셀을 수정하는 컬러 [] 변수를 사용 : 나는이 필요한,

Color[] pixelsTexture; 
(...) 
this.pixelsTexture[i] = newColor; 
(...) 
Texture2D tex = new Texture2D(GraphicDevice, this.texture.Width, this.texture.Height); 
tex.SetData(this.pixelsTexture); 
this.texture = tex; 

그러나 여기 이미지를 투명하게 만들어 사용자가 단계적으로 이미지를 드러내도록합니다. 나는 거기에 XNA를 사용하지 않고 이미지 thay 방식을 수정하는 간단한 방법 (나는 의미 : DirectX 물건을 사용하지 않고)?

답변

1

편집 2 : 난 그냥 런타임에 텍스처 수정을 위해 갈 것이 경우 : 참조

. GDI +를 사용하여 픽셀 단위로 이미지를 편집 할 수 있으므로 DirectX가 필요하지 않습니다. 당신은에 세트 그들의 Color.a 값을 당신의 '취소 숨어있는'작업의 중심 픽셀을 식별하고 주변 픽셀의 무리를 취할 터치 포인트를 사용하는 것이 0

편집 : 그래서

에 기반 귀하가 원하는 것은 귀하가 원하는 것이 무엇이든 클릭함으로써 사용자가 전체 이미지를 숨길 수있게하는 것입니다.

이미지를 사각형으로 자르고 싶지 않다고 말씀하셨습니다. 그럼 이미지 영역을 그리드로 분할하면됩니다. 말 그대로, 그리드의 셀이 이미지 위에 직접 배치되는 경우 그리드의 셀이 어떻게 배치 될지 계산하면됩니다.

예를 들어 256 x 256 이미지는 32 x 32 개의 보이지 않는 셀의 격자로 덮을 수 있습니다. 그러면 8 x 8 격자가됩니다.

이제 우리는 격자가 생겼으므로 각 셀의 범위를 파악하는 것은 비교적 간단합니다. 격자 셀을 나타 내기 위해 Rect 배열을 사용하면됩니다.

사용자가 이미지를 터치하면 터치 위치를 사용하여 터치 포인트를 각 그리드 셀의 왼쪽 위 및 오른쪽 아래 점과 비교하여 터치 한 그리드 셀을 파악할 수 있습니다. 왼쪽 위의 점이 '작고'오른쪽 아래의 점이 터치 포인트보다 '큰'셀을 얻을 때까지 이렇게합니다.

이제 터치하였습니다 보이지 않는 어느 셀을 알고 당신이해야 할 모든 편리 Rect 구조 : 그것은 그렇게 간단입니다

입니다 셀을 통해 직접 '숨어있는'질감을 그릴 수 있습니다. 최종 결과는 텍스처를 여러 개의 타일로 자른 것처럼 정확하게 나타납니다.

는 내 의견이 훨씬 빨리 실행시 수 등

ORIGINAL 답변 텍스처 커터보다 구현하기 간단합니다 :

내가 텍스처 수정 방법은 과잉이라고 생각합니다. peprixel 업데이트에 불필요한 오버 헤드가 발생합니다.

개인적으로 나는 터치 포인트에서 원하는 크기와 모양의 텍스처를 오버레이 할 것입니다. 텍스처는 반투명 또는 불투명하게 선택할 수 있습니다.

최종 결과는 오버레이 텍스처가 터치 포인트에서 이미지를 덮거나 숨길 때와 완전히 동일합니다. 가장 중요한 부분은이 작업을 수행하기 위해 다른 라이브러리가 필요 없다는 것입니다. 내가 이미지를했다, 나는 테두리를 그릴 필요 - 당신이 질감을 투명하게하고자하는 경우

+0

좀 더 정확하게 알려주시겠습니까? 나는 당신이 "접촉점에서 어떻게"어떻게 형성되는지를 정말로 보지 못합니다. – Myosotis

+0

나는 당신이 원하는 오버레이 모양의 텍스쳐를 만들 수 있었고 간단히 이미지 위에 그것을 보여줄 수 있었다. – Alex

+0

좋아, 이해했다. 하지만 어떻게하면 불투명하게 만들 수 있습니까? – Myosotis

0

, 당신은 내 경우 Color.Transparent

에 색상을 설정해야합니다, 당신의 경우에 비슷한 일을해야했다 원래 스프라이트를 그대로두고 스프라이트 바깥쪽에 배치합니다. 원래 스프라이트의 너비와 높이가 같고 높이가 +2 인 Texture2D 객체를 동적으로 생성하여이 작업을 수행했습니다 (원래 스프라이트 바깥 쪽 테두리를 오른쪽으로 그리기위한 것이고, 왼쪽, 오른쪽, 위쪽 및 아래쪽으로 한 픽셀 씩 그리기위한 것입니다).). 새 스프라이트 색을 Color.Transparent으로 설정하고 테두리를 그립니다.

귀하의 경우에는 조금 더 간단합니다. 솔리드 컬러로 스프라이트를 동적으로 생성 한 다음 사용자가 스프라이트에 닿을 때마다 Color를 Transparent로 설정합니다.

아래 코드는 스프라이트를 투명하게 설정합니다 (현재 VS에 액세스 할 수 없으므로 코드에 서식/문법 문제가있을 수 있음). 이 코드를 함수에 넣으면 투명과 그렇지 않은 코드를 동적으로 뒤집을 수 있습니다.

for (int i=0; i<this.pixelsTexture.Count; i++) 
{ 
    this.pixelsTexture[i] = Color.Transparent; 
} 
tex.SetData(this.pixelsTexture); 

EDIT : C++로 작성한 것으로 보았습니다. 내 코드는 C#이지만, 작동한다고 생각합니다.

+0

이것은 내가 XNA에서 일했던 것이다 (나의 질문에있는 코드를 보라). 그러나 XNA를 사용하지 않을 때는 스프라이트가 없기 때문에 어떻게 연결합니까? 픽셀 텍스처를 이미지와 연결합니까? – Myosotis

+0

죄송합니다. XNA 태그가있어 질문에 대한 오해를했습니다. 나는 XNA에서 일하고 있다고 생각했다. ( – George