2014-11-05 18 views
0

이미지를 조작하기 위해 lockbits 사용에 대한 많은 C# 자습서를 읽었지만이 정보를 powershell에 적용하는 방법을 모르겠습니다.DrawImage가 느리므로 구조가 lockbits가됩니까?

이 문제는 다음과 같습니다.

$ image1의 높이는 2950 픽셀입니다. $ image2의 높이는 50px, 3000 픽셀입니다. $ image1에 $ image2를 맞춰야하고 $ image2의 처음 49 줄을 건너 뛸 수 있습니다. 의사에 그래서 :

For(y=0... For(x=0.... { image1(x,y) = image2(x,y+50) } ....)) 

작품 아래 파워 쉘 스크립트는하지만 매우 빠른 작동하지 않습니다

$rect = new-object Drawing.Rectangle 0, 0, $image1.width, $image1.height 
$image1drawing.drawimage($image2, 
         $rect, 
         0, 50, $image2.width, ($image2.height - 50), 
         $graphicalUnit) 

등이 (Problem with using lockbits) 등 내가 찾은 페이지 또는이 (http://bobpowell.net/lockingbits.aspx을)에 "평범한 영어"이지만이 개념을 powershell로 변환하는 방법은 무엇입니까?

답변

0

올바른 방법을 사용하고 있습니다. DrawImage을 사용하면 픽셀을 하나씩 복사하는 것이 더 빠릅니다. 원본 이미지에서 사각형을 복사 Image.Clone를 사용하여

  1. 시도, 이것은 당신이 만들 필요가 개체의 작은 숫자가 발생합니다 : 제안은 빨리 확인합니다.
  2. 원본 이미지와 동일한 PixelFormat을 사용하고 있는지 확인하십시오 (빠른 복사). Image에는 PixelFormat 속성이 있습니다.
  3. 가장 중요 : WidthHeight에 액세스하는 데 시간이 오래 걸리므로 다시 로컬 변수에 저장하여 다시 사용할 수 있습니다. 당신이 그 (것)들을 손에서 미리 cognize 경우에 속도를 올리는 좋은 방법이다.
  4. 4 : 3의 가로 세로 비율에서 기적을 기대하지 마십시오. 이미지 당 3932 * 2950 * 3 (24 비트 RGB라고 가정) = 33MB입니다. 데이터가 많기 때문에 이미지의 개수에 따라 몇 개의 광고를 쉽게 복사 할 수 있습니다.

간단한 cmdlet을 작성하고 PowerShell 스크립트에서 사용하는 것이 좋습니다.

은 BTW 경우 당신은 여전히 ​​관심이 :

는 (귀하의 예에 따라) unsafe context and using pointers에 의존하는 C#으로 lockbits 사용. PowerShell이 ​​안전하지 않은 컨텍스트에 액세스 할 수 있다고 생각하지 않습니다.
Marshall 클래스를 사용하여 안전하지 않은 컨텍스트를 사용하지 않고 관리되지 않는 데이터를 조작 할 수 있습니다. 특히 ReadWrite 방법 (메모리를 희생시키면서 Copy 메서드를 사용하면 작업 속도를 향상시킬 수 있습니다).
PowerShell은 CmdLets가 사용하는 .Net 일반 언어의 대체품이 아닙니다.

+0

좋은 정보, 감사합니다. 당신은 제가 좀 더 조정을하고 제 루프와 가변적 인 사용법 등을 재검토하도록 동기를 부여했습니다. "set-put-pixel/drawimage/performance"라는 주제를 탐색하면서 모든 프로그래밍/그래픽 문제에 대한 보편적 인 해결책으로 lockbit을 오해했습니다. –