2012-05-17 4 views
6

PixelFormat.Format24bppRgb 인코딩을 사용하여 거대한 이미지 (aprox 24000 x 22000)를 만들어야합니다. 나는C#에서 거대한 이미지 생성

난 할 노력하고있어 것은 이것이다 ... 그것은 거의 불가능 엽니 다 알고 : 나는의 11기가바이트 파일을 처리 할 수 ​​없기 때문에, 예외가 발생 예상대로

Bitmap final = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

그렇게 쉬운 기억.

하지만 아이디어가 있습니다. 파일을 생성 할 때 쓸 수 있습니까? 따라서 RAM을 사용하는 대신 HD로 작업하게 될 것입니다.

단지 설명하자면 : 나는 약 13K의 타일을 가지고 있으며,이 어리석은 거대한 파일에서 함께 바느질 할 계획입니다. 주어진 순서대로 반복 할 수 있기 때문에 안전하지 않은 코드를 사용하여 메모리에 직접 쓸 수 있습니다.

제안 사항?

+0

비보안 코드 대신 안전하지 않은 코드를 읽으십시오 ... –

+4

[메모리 매핑 된 파일] (http://msdn.microsoft.com/en-us/library/dd997372.aspx)을 참조하십시오. – GSerg

+1

@GSerg 메모리 맵핑 된 파일 _can_ 큰 파일의 섹션을 열거 나 편집하는 데 사용할 수 있지만 .... ** 권장되지 않음 ** 큰 파일을 메모리 mappedfile에 생성합니다! –

답변

2

BMP와 같은 압축되지 않은 형식으로 작성할 수 있습니다. BMP는 원시 색상 바이트를 행에 저장합니다. 따라서 첫 번째 행의 타일을로드하고 별도의 픽셀 행을 읽고 출력 이미지에 복합 단일 행으로 작성합니다. 이렇게하면 몇 개의 타일 만 열어서 출력 이미지를 즉시 적을 수 있습니다.

하지만 JPG 또는 PNG와 같이 압축 된 이미지로 쓰는 방법을 모르겠습니다. 하지만 일부 전문 소프트웨어가 필요하다고 확신합니다.

+0

당신의 아이디어를 얻었지만 좋은 접근 방법이지만, 문제가 있습니다 : Bitmap 클래스가 시스템이 큰 파일을 처리 할 수 ​​있는지를 검사 할 때, 새로운 Bitmap()으로부터 통과시키지 않습니다. –

+1

요점은 이미지 조작을 위해 빌드 - 인 클래스를 사용해서는 안된다는 것입니다. 당신은 그것을 원시해야합니다. 그래서 내가 말했듯이, 매우 간단한 원시 이미지 형식 인 BMP를 사용하면 복잡한 압축 알고리즘없이 작성할 수 있습니다. – Euphoric

+0

음 ... 이제 알았다. 그것은 참으로 좋은 생각입니다! 나는 시도를 줄 것이다! 감사! –

0

완료 할 때이 이미지로하려는 의도에 따라 4로 나누고 그 방법으로 작업하는 것이 좋습니다. OOM 예외가 발생하지 않고 10,000 x 10,000 픽셀로 작업했습니다.

+0

지금 당장은 정확히 내가하고있는 일이며 유효한 해결 방법이지만이 파일을 만드는 데 급한 일이 없기 때문에 문제에 대한 접근법을 연구 중입니다! –

+0

FWIW, 8192 x 8192 픽셀 이하로 유지하는 것이 훨씬 안전하다는 것을 알았습니다. 특히 한 번에 여러 텍스처를 메모리에 유지하는 경우 (예 : 하나에서 다른 것으로 복사) – ToolmakerSteve

3

ImageMagick의 Large Image Support (테라 픽셀)은 타일을 작성한 후에 이미지를 함께 넣을 수 있도록 도와줍니다. 명령 줄을 사용하고 this 래퍼를 사용하여 명령을 실행하거나이 ImageMagick.NET을 API로 사용할 수 있습니다.

+0

유망 해 보인다! 이 API에 대해 살펴 보겠습니다. 감사! –

+0

ImageMagik의 버전이 업데이트되었습니다.NET http://magick.codeplex.com/ – Jonathan

+0

ImageMagick.NET에 대한 링크를 제공해 주셔서 감사합니다. – ToolmakerSteve