2011-02-04 3 views
0

DrawImage Image 함수를 사용하여 이미지에서 다른 이미지로 부분을 복사합니다. 복사 된 부분이 "더 어둡게"만들 수 있습니까? 특별한 색조처럼? 누군가 예를 들어 줄 수 있습니까? ImageAttributes라는 것을 들었지만 찾지 못했습니다!Graphics.DrawImage가 어두워 졌습니까?

참고 : 원본 이미지를 편집하고 싶지 않습니다.

+0

이 루틴의 성능이 느린 것에 대한 귀하의 질문에 대한 답변을 작성했지만 답변을 제출하려 할 때 질문이 삭제되었음을 알았습니다. 그 문제를 이미 해결 했습니까? 아니면 그 문제가 부적절하다고 결정 했습니까? –

+0

애플리케이션의 성능을 최적화 할 수있었습니다. 그러나 나는 당신의 아이디어를 듣는 것에 확실히 관심이있을 것입니다! – Voldemort

답변

1

의 drawImage 기능은 심지어 ImageAttributes 그 이유가 정확히 개체를 설정하는 특별한 과부하가 :하지만 후속 질문에,

private void Example(PaintEventArgs e) 
{ 
    ImageAttributes imageAttr = new ImageAttributes(); 
    imageAttr.SetGamma(2.2f); 

    Rectangle rect = new Rectangle(250, 20, 200, 200); 
    e.Graphics.DrawImage(myImage, rect, 0, 0, 200, 200, GraphicsUnit.Pixel, imageAttr);  
} 
+0

내 문제는 VB.NET이 "ImageAttributes"를 인식하지 못하는 것입니다. – Voldemort

+0

System.Drawing.Imaging 네임 스페이스를 가져와야합니다. – Foxfire

+0

고마워, 지금 당장! – Voldemort

1

  (반드시이 질문에 직접적인 대답을 그 성능이 저하에 DrawImage 방법에 ImageAttributes 귀착 지정 삭제하기 때문이다. 그 질문은  했다,하지만 난 이미 작성된 것 때문에 나는 어쨌든, 여기 내 대답을 기록했다. 원하는 경우 무시한다.)

그래픽을 그리는 속도가 느립니다. 특히 렌더링 효과를 동시에 적용하는 경우에는 더욱 그렇습니다. 몇 분만 Photoshop에서 작업하고 나면 의미를 알 수 있습니다. 이미지를 어둡게하는 것은 계산하기에 비용이 많이 드는 작업입니다. 더 빨리 진행할 수있는 방법은 없습니다.

.NET Framework의 System.Drawing.Graphics 클래스의 루틴이 내부적으로 이 아니고 하드웨어 가속을 사용하는 GDI +를 사용하여 구현된다는 사실 때문에 문제가 더 복잡해집니다. 가능한 대안은 대부분의 시스템에서 하드웨어 가속화 된 GDI 기반 렌더링으로 다시 전환하는 것입니다 (비디오 카드의 공급 업체에 따라 다르지만 현재 볼 수있는 거의 모든 카드에는 비트 블록 전송과 같은 기본 기능을위한 하드웨어 가속 기능이 있습니다) . 물론 Windows API에서 GDI 기반 드로잉 루틴을 사용하는 P/Invoke 함수가 필요하기 때문에 훨씬 더 어려워집니다. .NET에서 제공하는 모든 것은 GDI +입니다. 필요한 것보다 훨씬 더 많은 작업이 필요하며 최신 하드웨어 (특히 Windows Vista/7의 Aero 테마 사용, GDI와 함께 하드웨어 가속을 사용하지 않는 경우는 속도가 향상됩니다. 모든 것이 메모리의 비트 맵에 저장되기 때문에) .

아직 마음에 봄 않는 현재 구현 가능한 최적화의 부부와 함께 튀어 나와 : 당신이 그것을 다시 그릴 때

  1. 당신은 이미지 크기를 조정하고 있습니까? 그렇다면 비교를 위해 이미지가 보간 될 필요가 있습니다.

  2. 무엇이 PixelFormat의 이미지입니까? Format32bppPArgb은 대안보다 훨씬 빠릅니다. 해당 형식의 이미지로 작업하고 있는지 확인하십시오. 지금이 아니라면이 변경을하면 렌더링 속도가 크게 향상됩니다.

  3. 왜 이미지를 자주 다시 렌더링해야합니까? 동일한 이미지 인 경우 효과를 적용하고 반환되는 Bitmap 객체를 캐시합니다. 그런 다음 이미지를 다시 그릴 때마다 새 이미지를 만드는 대신 이미 메모리에있는 이미지를 사용하십시오. 간단한 트릭이지만 매번 값 비싼 부분을 다시하지 않아도됩니다. 언급 한대로 DrawImage 만 있으면 렌더링 된 속성을 설정하는 것보다 훨씬 빠릅니다.

일반적으로 사용자는 큰 이미지가 렌더링되기를 기다리고 있습니다. 따라서 그래픽 루틴을 최적화하는 것보다 인터페이스를 적절히 설정하는 것이 더 적절합니다.진행 막대와 바쁜 커서가 실제로 일어나고 있음을 나타내는 데 사용된다는 것은 코드에서 몇 밀리 초를 쥐어 짜는 것보다 사용자가 염려하는 한 훨씬 더 많이 진행될 것입니다. 이 효과를 100 회 또는 1000 회 루프에서 계속 반복 적용하지 않는 한 (이는 매우 어리석은 것처럼 보입니다.) 최적화하는 데는 시간이 걸리지 않습니다.

관련 문제