먼저 사족부터. 파일스트림으로 읽어들이는 jpg 이미지 데이터를 왜 배열형 버퍼에 저장하는지 이해가 안됩니다.
배열로 가지고 있어야 할 어떤 필요성이 있나요? 만약 단지 이미지를 메모리에 저장해둘 필요가 있어서 그런 것이라면, 파일스트림으로 읽어들인 후 메모리스트림으로 CopyFrom을 해버리면 그만입니다. 스트림 형태로 가지고 있는 것이 여러가지 목적으로 편합니다.
그럴 필요가 반드시 있다는 전제 하에 코드를 보면,
p:= TMemoryStream.Create;
p:=@Image_buff;
image321.Bitmap.LoadFromStream(p);
이 코드를 보면, 메모리스트림을 생성해서 p 포인터에 저장한 후 바로 p에 배열 버퍼 주소를 할당해서, 방금 생성했던 메모리스트림은 메모리 리크가 되어버렸습니다. 제대로 동작하느냐와 무관하게 이렇게 메모리 리크를 만들어냈다는 자체가 일단 문제이구요. 만약 이 코드를 1MB짜리 사진 파일에 대해 100번만 실행해도 100MB의 메모리를 잃어버리게 되고, 1,000번이면 1GB의 메모리를 날리게 될 겁니다.
어쨌든, 의도하신 것은 아마도 Image_buff 포인터의 내용을 메모리스트림에 복사하는 것인 거 같은데요.
그런 경우에는 스트림 클래스들의 공통 메소드인 ReadBuffer() 함수를 쓰는 것이 정석입니다.
이 메소드의 첫번째 인자는 읽어들일 포인터, 두번째 인자는 읽어들일 메모리의 크기입니다.
그럼...
델파이어렵 님이 쓰신 글 :
: isize:=Cam_Func.gGMICGetImage(1,@buff,1);
: Memo1.Lines.Add('isize = '+ inttostr(isize));
:
: AStream := TFileStream.Create('test.jpg', fmCreate);
:
: for i:=0 to isize do
: begin
: // 함수에서 가져온 pointer로부터 배열에 jpeg data 복사.
: Image_buff[i]:=buff[i];
: end;
: // 파일로 출력
: AStream.Write(Image_buff, isize);
:
: AStream.Free;
: // 디스크에 저장된 이미지를 읽어서 화면에 출력..
: temp_jpg:=Tjpegimage.Create;
: temp_jpg.LoadFromFile('test.jpg');
: image321.bitmap.Assign(temp_jpg);
:
: // 배열에 저장된 이미지를 화면에 출력.
: temp_jpg:=Tjpegimage.Create;
: // [Error] Incompatible types: 'TPersistent' and 'Array'
: temp_jpg.Assign(Image_buff);
: //temp_jpg.Assign(@Image_buff); 문법 에러는 안나지만 이미지 출력시 메모리 에러.
: image321.bitmap.Assign(Image_buff);
:
: { 메모리 관련 에러 출력.}
: p:= TMemoryStream.Create;
: p:=@Image_buff;
: image321.Bitmap.LoadFromStream(p);
:
: 우선 배열에서 파일로 출력은 잘 됩니다.
: 출력된 파일을 디스크에서 읽어서 화면에 뿌리는것도 됩니다.
: 그런데 배열에서 바로 화면에 뿌리는 부분이 잘 안됩니다
:
: 원래 C만하다가 델파이를 하려니 너무 힘이 듭니다.
: 책보고 인터넷 찾아보고 조금씩 짜고 있지만.. 막히는 부분이 너무 많네요. ㅜㅡ
:
: 고수님들의 도움이 절실 합니다.
|