2010-04-12 2 views
6

큰 PNG 이미지를 한 픽셀 씩 파싱해야하는 메소드가 있습니다 (PNG는 각각 600x600 픽셀입니다). 그것은 시뮬레이터에서 잘 작동하는 것 같지만, 장치 (iPad)에서는 EXC_BAD_ACCESS를 내부 메모리 복사 기능으로 사용합니다. 작은 크기의 이미지로 시도하면 모든 것이 제대로 작동하기 때문에 크기가 문제인 것 같습니다. 아래의 방법과 관련된 기억의 고기가 있습니다. iPhone/iPad에서 CGBitmapContextCreate

+ (CGRect) getAlphaBoundsForUImage: (UIImage*) image 
{  
    CGImageRef imageRef = [image CGImage]; 

NSUInteger width = CGImageGetWidth(imageRef); 
NSUInteger height = CGImageGetHeight(imageRef); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

unsigned char *rawData = malloc(height * width * 4); 
memset(rawData,0,height * width * 4); 

NSUInteger bytesPerPixel = 4; 
NSUInteger bytesPerRow = bytesPerPixel * width; 
NSUInteger bitsPerComponent = 8; 
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

CGColorSpaceRelease(colorSpace); 

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
CGContextRelease(context); 

/* non-memory related stuff */ 

free(rawData); 

나는 이미지의 무리에이 실행

, 그것은 12 회를 실행 한 후 시뮬레이터에 아무 문제를 실행하지 않습니다 동안 밖으로 배변. 너희들은 어떤 생각을 가지고 있니?

답변

0

CGImageCreate()를 사용하여 내 iPad (물론 iPhoneOS 3.2)에서도 유사한 오류가 발생했습니다. 당신의 어려움을보고 나에게 힌트를주었습니다. 나는 2 행 정렬의 전력을 제공하는 것이 또한 문제가 해결되는지 알려 주시기 바랍니다 2.

size_t bytesPerRowPower2 = (size_t) round(pow(2.0, trunc(log((double) bytesPerRow)/log(2.0)) + 1.0));

의 다음 큰 권력을 내 bytesPerRow를 정렬하여 문제를 해결했다. * rawData에 조정 된 크기를 할당하고 bytesPerRowPower2를 CGBitmapContextCreate()에 전달해야합니다. 높이에 정렬이 필요하지 않은 것 같습니다.

0

아마도 CGImageGetBytesPerRow (두 개의 소리가 너무 큼).

0

이미지를 프로그래밍 방식으로 생성 할 때 행 크기를 직접 정의하는 응용 프로그램에서 두 개의 정렬 된 행 크기를 사용했습니다. 그러나 나는 또한 제안을 시도하기 전에 CGImageGetBytesPerRow를 시험해보기 위해 toastie를 추천 할 것이다.

3

12 회 실행 후 메모리 부족 문제와 같은 소리가납니다. 내부적으로 CGContext가 대규모의 자동 레이아웃 된 구조를 생성 할 수도 있습니다. 이 작업을 반복적으로 수행하고 있기 때문에 해제되지 않으므로 메모리가 부족 해져서 죽습니다.

비록 내가 어떻게 Core Foundation이 임시 객체를 다루는 지 잘 모르겠습니다. 나는 CF 오브젝트가 autorelease와 동등하다고 생각하지 않으며 Core Graphics 컨텍스트는 NSObjects가 아닌 CF 오브젝트를 다루고있다.

코드에서 메모리 변동을 줄이려면 처리를 시작하기 전에 한 번씩 오프 스크린 CGContext를 생성하도록 리팩터링하고 각 이미지를 반복적으로 처리하는 것이 좋습니다. 완료되면 놓습니다. (루프를 통과 할 때마다 거대한 데이터 구조를 할당하지 않기 때문에) 어떤 경우이든 더 빠를 것입니다.

충돌 문제를 해결할 수있는 방법을 베팅하고 코드가 생성 될 것이라고 내기합니다. 훨씬 더 빠릅니다. 메모리 할당은 다른 작업에 비해 매우 느리며 600x600 픽셀 RGBA 이미지를 처리하기 위해 꽤 큰 데이터 구조를 사용하고 있습니다.

0

장치에서 응용 프로그램을 실행하는 동안 계측기 할당을 실행하면 메모리 관련 문제가 발생합니다. 루프에있는 경우 루프 내부에 자동 릴리스 풀을 만듭니다.

3

> 제품 구성 -> 스키마 편집 -> 좀비 개체 사용. 좀비 오브젝트 사용하기 전에 눈금을 표시하십시오. 이제 그것을 빌드하고 실행하십시오. EXC_BAD_ACCES 오류에 대한 설명을 더 잘 나타낼 수 있습니다.

0

아마 색 공간 심판으로

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
CGColorSpaceRelease(colorSpace); 

CGColorSpaceRelease(colorSpace); 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 

여전히 어떻게 든 필요할 수 있습니다 대체? 그냥 무작위 추측 ... 어쩌면 컨텍스트의 출시 뒤에 놓을 수 있을까요?

// cleanup 
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 
0

정사각형 문맥 (width = height)을 만들어 문제를 해결했습니다. 512x256 텍스처를 가지고 있었고 OpenGL에 데이터를 보낼 때마다 충돌이 발생했습니다. 이제 512x512 버퍼를 할당하지만 512x256을 렌더링합니다. 희망이 도움이됩니다.

관련 문제