Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[11690] Re:[질문] Jpeg 데이터 배열을 화면에 출력하는 방법 좀 도와 주세요.
박지훈.임프 [cbuilder] 1881 읽음    2008-01-15 14:05
먼저 사족부터. 파일스트림으로 읽어들이는 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만하다가 델파이를 하려니 너무 힘이 듭니다.
: 책보고 인터넷 찾아보고 조금씩 짜고 있지만.. 막히는 부분이 너무 많네요. ㅜㅡ
:
: 고수님들의 도움이 절실 합니다.

+ -

관련 글 리스트
11680 [질문] Jpeg 데이터 배열을 화면에 출력하는 방법 좀 도와 주세요. 델파이어렵 1804 2008/01/09
11690     Re:[질문] Jpeg 데이터 배열을 화면에 출력하는 방법 좀 도와 주세요. 박지훈.임프 1881 2008/01/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.