2013-07-24 2 views
1

QT를 사용하고 있으며 기본 MS 페인트 연필 드로잉 도구를 만들 수있었습니다. 일련의 점을 선으로 연결하여 연필 도구를 만들었습니다. 불투명 한가는 선은 좋지만 두껍고 투명한 선에서는 알파 투명도가 겹칩니다 (선이 공유 점에서 교차하기 때문에). 내가 연구하고 몇 가지 제안은 별도의 투명 버퍼에 그려 거기에 렌더링하고 최대 불투명도를 얻고 원래의 버퍼로 다시 렌더링하는 것이지만, Qt에서 그렇게하는 방법을 모른다.Qt : 연필/브러쉬 도구 만들기

저는 그래픽이나 Qt에 익숙하지 않으므로 접근법을 알지 못합니다. MyPaint 및 Krita와 같은 프로그램은 겹치는 부분없이 멋진 투명 선을 유지하기 위해 브러시를 어떻게 처리합니까?

내가 원하지 않는 무엇 :

enter image description here


내가 원하는 효과를 : 당신이 코드를 표시하지했듯이 enter image description here

+0

동일한 문제를 설명하는 자주색 인간과 연결된 질문입니까? – sashoalm

+0

네, 똑같은 문제, 그리고 그것에 대해서도 동일한 대답을했습니다. –

답변

2

, 나는 가정을 만들려고 해요 당신이하고있는 일은 포인트 세트를 저장 한 다음 페인트 기능을 사용하여 화가를 사용하여 그 포인트를 그리는 것입니다. 당신이 얻고있는 효과는 이미 그린 영역을 그릴 때입니다.

이 문제를 방지하는 데 사용할 수있는 한 가지 방법은 QPainterPath 개체를 사용하는 것입니다. 마우스 다운 이벤트가 발생하면 QPainterPath 객체에 moveTo 함수를 사용하십시오. 그런 다음 마우스 이동 이벤트에 대해 lineTo 함수를 호출하십시오.

마지막으로 렌더링 할 때 점을 그리는 대신 QPainterPath 객체를 렌더링하십시오.

---------- 편집 ----------------------------------- ---

원하는 효과의 예제를 추가 했으므로 문제가 더 잘 이해되어 여기에서 QPainterPath를 사용할 수 없지만 불투명 한 선을 사용하는 것이 좋습니다.

그러나 QPainterPath에 줄을 추가하기 전에 그라디언트가 변경되면 QPainterPath에 그라디언트 펜을 사용하여 원하는대로 작동시킬 수 있습니다. 별도의 투명 버퍼에

무승부가 렌더링 최대 불투명도를 획득하고 다시 원래의 버퍼를 렌더링 -을 : 또는 ...

당신은 원래 답이 언급했다.

이것은 버퍼라는 단어로 인해보다 복잡해 보입니다. 실제로는 별도의 QImage를 만들고 화면이 아닌 그 위에 그립니다. 그런 다음 화면을 그릴 때 대신 이미지를 복사합니다. '최대 불투명도'를 얻으려면 이미지의 비트를 스캔하고 알파 채널을 보거나 펜의 압력과 각 지점의 위치를 ​​기록하는 별도의 정보 구조를 유지할 수 있습니다. 알파가 증가하고 감소 할 때의 최대 값과 최소값을 얻고 매분마다 변경을 매핑하는 대신 렌더링 값을 선형으로 보간합니다.

버퍼 이미지를 기본 이미지로 다시 렌더링 할 때 QPainter에서 컴포지션 모드를 설정해야하지만 머리 꼭대기에서 어느 것이 확실하지는 않습니다.문서가 무엇인지 확인하고 실험을 통해 어떤 효과가 있는지 확인하십시오.

내 경험으로 그래픽을 사용하여 어떤 효과가 있는지 살펴보고 자신이하고있는 것에 대해 느낌을 갖기 위해 실험해야 할 필요가있는 경우가 종종 있습니다. 특히 사용하는 방법이 속도가 느리고 합리적인 프레임 속도로 작동하도록 최적화해야합니다.

+0

이 투명 투명 선에 적합합니다. 그리고 패스를 사용하려고했지만 투명에서 불투명으로가는 브러시 획을 얻을 수 없습니다. 그리고 그 효과를 원합니다. 경로가 하나의 역할을하기 때문에 경로가 문제를 해결하지 못합니다 (블렌딩이 발생하지 않음). 시도했기 때문에 시도했습니다. – theta

2

나는 this 질문에 대한 답을 참조하십시오. 여기에서도 마찬가지입니다. 링크 만 제공하지 않는 위해서

, 나는 여기에 대답을 반복합니다 :

당신은 소스에 화가의 구성 모드를 설정해야합니다. 지금 소스와 목적지를 모두 그립니다.

painter.setCompositionMode (QPainter :: CompositionMode_Source);

투명한 영역을 기본 드로잉을 통해 표시하려면 결과의 컴포지션 모드를 다시 CompositionMode_SourceOver로 설정하고 대상을 그려야합니다.

아직 답을 구할지 모르겠지만 이것이 도움이되기를 바랍니다.

+1

이미 질문에 대한 답변이 있고 정확히 같으면 의견을 입력 할 수도 있습니다 OP 질문에 그것이 가능한 복제본이라고합니다. – Rizier123

+0

@ Rizier123 그래, 고마워. 나는 여기에서 새로운 사람이다. –

+0

그렇다면 여기를 둘러 보시고 http://stackoverflow.com/tour를 방문 하시어 사이트 작동 방식을 확인하십시오. D (Welcome on SO) – Rizier123