2009-07-04 2 views
1

TStream으로받은 이미지를 조작하려고합니다. 메모리에서로드하여 파일에 쓰지 않겠습니다.OpenIL (Devil) : Delphi에서 ilLoadL 사용

inImage: TStream; 

"덩어리"변수로 선언 : 다음

함수에
imgLump: Array of TILubyte; 

I 수행 이것

// setting input image into a "lump" 
SetLength(imgLump, inImage.Size); 
// rewind stream to beginning 
inImage.Seek(0, soBeginning); 
// read stream and write into array 
inImage.Read(imgLump[0], inImage.Size); 
loaded := ilLoadL(IL_JPG, imgLump, Length(imgLump)); 

입력 변수 선언 스테이지에서로드 된 값은 0 ()입니다.)이며 ilGetError() 호출은 1298 (IL_FILE_READ_ERROR)을 반환합니다.

왜?! 내가 놓친 게 무엇입니까?

감사합니다, 일란

답변

0

먼저이 시도 : 파일에 스트림 쓰기 시도 :

1 단계 :

loaded := ilLoadL(IL_JPG, @imgLump[0], Length(imgLump)); 

를 문제가 해결되지 않는 경우,이 시도 좋아하는 이미지 뷰어를 사용하여 엽니 다.

스트림이 손상되어 작동하지 않습니다.

2 단계 : 배열을 파일에 쓰고 확인하십시오.

작동하지 않습니다. 스트림 대 배열이 잘못되었습니다.

3 단계 : 모든 파일이 유효하면 문제는 ilLoadL으로 전화해야합니다. 설명서를 다시 확인하거나 원본 개발자에게 물어보십시오.

+0

확실히 그렇지 않습니다. 어쩌면 @imgLump [0], 그래도. –

+0

배열이 연속적인 블록이기 때문에이 둘의 차이점은 없습니다. 이 어설 션은 유효합니다 : @array = @array [Low (array)], 즉 양쪽 포인터는 메모리의 동일한 주소를 가리 킵니다. –

+0

좋아, 나는 의심의 여지가 있었지만 나는 해체를 확인했다. 그것은 확실히 동일합니다 :) –

1

스트림에서 검색하지 않겠습니다. 대부분의 API는 스트림을 받았을 때 올바른 위치에서 읽을 수있는 위치가 현재 위치라고 가정합니다. 그들은 원하는만큼의 데이터를 읽은 다음 스트림을 그 위치에 두어 다음 함수가 계속 읽을 수 있도록 준비합니다. 스트림에서 필요합니다. 전체 스트림이 스트림이라고 가정해서는 안됩니다. 호출자는 다른 물건을 미리 가질 수 있습니다. 또는 스트림이 뒤로 검색하거나 검색하는 것을 지원하지 않을 수도 있습니다.

스트림에 JPEG 데이터가 포함되어 있습니까? 처음 몇 바이트는 어떻게 생겼습니까? 대신 TJpegImage으로 이미지를 열어 보았습니까?

TILubyte은 보통 Byte과 동일합니까? Devil이 "덩어리"를 다른 사람들이 일반 배열이나 메모리 버퍼라고 부르는 것과 똑같은 것으로 부르는 것입니까?

+0

나는 그것을 고려할 것이다. 어쨌든 이번에는 함수와 호출자를 모두 제어하므로 스트림 내에있는 내용을 정확히 알고 있습니다. 파일 기반 솔루션 (다른로드 기능)이 원활하게 작동합니다. 비표준 용어를 고안하지 않았습니다 ... 여기에서 가져 왔습니다 : http://openil.sourceforge.net/tuts/tut_5/index.htm 제 생각에 그는 표준 배열을 사용합니다. TILuByte는 Byte로 정의됩니다. –