Q&A

  • 이런 경우 어떻게 합니까?
이런 경우 어떻게 합니까?



한개의 화일이 있습니다..

그 화일에는 헤더, JpgImage1, JpgImage2, JpgImage3 등이 들어 갑니다..



일단 저장에는 성공 했습니다..



읽어 들이는 부분이 문제 인데요..



TJPEGImage에 있는 LoadFromStream이라는 메소드를 쓰고 싶습니다..



LoadFromStream를 쓸려면 스트림 객체를 요구 하는데...

그래서 전 TMemoryStream를 선택 했습니다.



보시면 아시 겠지만 BlockRead의 함수를 사용해 Buf라는 포인터로 값을 읽어

오거든요..

근데 그걸 TMemoryStream에 쓸수 있는 방법이 없습니다..





var Buf : PChar;

i : integer;

Jp : TJPEGImage;

Ms : TMemoryStream;

begin

Ms := TMemoryStream.Create;

jp := TJPEGImage.Create;



OpenDialog1.InitialDir := ExtractFilePath(ParamStr(0));

OpenDialog1.Filter := '*.jpg';

if not OpenDialog1.Execute then OpenDialog1.FileName := '';



//헤더를 읽는다.

AssignFile(ReadFileStream, OpenDialog1.FileName);

Reset(ReadFileStream, 1);

BlockRead(ReadFileStream, FileHader, Sizeof(FileHader));



//헤더를 제외한 실제 Jpg Data의 부분으로 분기 한다.

Seek(ReadFileStream, Sizeof(FileHader) + 100);



//헤더에 있는 싸이즈 만큼 읽는다..

if FileHader.BackImg.ImgSize > 0 then

begin

GetMem(buf, FileHader.BackImg.ImgSize);

ZeroMemory(buf, FileHader.BackImg.ImgSize);

BlockRead(ReadFileStream, buf[0], FileHader.BackImg.ImgSize);

// Ms.ReadBuffer(buf, FileHader.BackImg.ImgSize); --> 이부분

FreeMem(buf, FileHader.BackImg.ImgSize);

end;



try



finally

CloseFile(ReadFileStream);

end;



아시는 분은 답변좀 해주세요...

염치 없지만 감사 합니다..



3  COMMENTS
  • Profile
    김진호 2000.06.22 20:05
    최용일님....답변 감사 드립니다..

    근데...어느 스트림에서 읽었다는 건지 모르겠습니다..



    Ms.ReadBuffer(buf, FileHader.BackImg.ImgSize); --> 이부분은 제가 하다하다 않되서

    ReadBuffer까지 다 해봤습니다...

    이걸 오해 하신건가여?



    그리구여 ReadFileStream : File; 입니다..



    지금두 헤메고 있는데..

    Write메소드를 사용 하지 않은건 아닙니다...



    Ms.Write(buf, FileHader.BackImg.ImgSize) 하면 오류가 일어나고



    Ms.Write(buf[0], FileHader.BackImg.ImgSize) 하고난뒤 SaveFromStream하면 아무 내용도 있지 않습니다..



    뭐가 잘못된건가여?



    아님 다른 방법이라도 좋습니다..



    김진호 wrote:

    > 이런 경우 어떻게 합니까?

    >

    > 한개의 화일이 있습니다..

    > 그 화일에는 헤더, JpgImage1, JpgImage2, JpgImage3 등이 들어 갑니다..

    >

    > 일단 저장에는 성공 했습니다..

    >

    > 읽어 들이는 부분이 문제 인데요..

    >

    > TJPEGImage에 있는 LoadFromStream이라는 메소드를 쓰고 싶습니다..

    >

    > LoadFromStream를 쓸려면 스트림 객체를 요구 하는데...

    > 그래서 전 TMemoryStream를 선택 했습니다.

    >

    > 보시면 아시 겠지만 BlockRead의 함수를 사용해 Buf라는 포인터로 값을 읽어

    > 오거든요..

    > 근데 그걸 TMemoryStream에 쓸수 있는 방법이 없습니다..

    >

    >

    > var Buf : PChar;

    > i : integer;

    > Jp : TJPEGImage;

    > Ms : TMemoryStream;

    > begin

    > Ms := TMemoryStream.Create;

    > jp := TJPEGImage.Create;

    >

    > OpenDialog1.InitialDir := ExtractFilePath(ParamStr(0));

    > OpenDialog1.Filter := '*.jpg';

    > if not OpenDialog1.Execute then OpenDialog1.FileName := '';

    >

    > //헤더를 읽는다.

    > AssignFile(ReadFileStream, OpenDialog1.FileName);

    > Reset(ReadFileStream, 1);

    > BlockRead(ReadFileStream, FileHader, Sizeof(FileHader));

    >

    > //헤더를 제외한 실제 Jpg Data의 부분으로 분기 한다.

    > Seek(ReadFileStream, Sizeof(FileHader) + 100);

    >

    > //헤더에 있는 싸이즈 만큼 읽는다..

    > if FileHader.BackImg.ImgSize > 0 then

    > begin

    > GetMem(buf, FileHader.BackImg.ImgSize);

    > ZeroMemory(buf, FileHader.BackImg.ImgSize);

    > BlockRead(ReadFileStream, buf[0], FileHader.BackImg.ImgSize);

    > // Ms.ReadBuffer(buf, FileHader.BackImg.ImgSize); --> 이부분

    > FreeMem(buf, FileHader.BackImg.ImgSize);

    > end;

    >

    > try

    >

    > finally

    > CloseFile(ReadFileStream);

    > end;

    >

    > 아시는 분은 답변좀 해주세요...

    > 염치 없지만 감사 합니다..

    >

  • Profile
    최용일 2000.06.22 20:54
    안녕하세요 최용일입니다.



    Ms.ReadBuffer(buf, FileHader.BackImg.ImgSize); 이부분이 메모리 스트림에 쓰는 것이



    아니라 읽는 것입니다.



    LoadFromStream을 사용하실려면 먼저 스트림에다 데이타를 써야죠...



    ^^ 항상 즐코하세요.



    김진호 wrote:

    > 최용일님....답변 감사 드립니다..

    > 근데...어느 스트림에서 읽었다는 건지 모르겠습니다..

    >

    > Ms.ReadBuffer(buf, FileHader.BackImg.ImgSize); --> 이부분은 제가 하다하다 않되서

    > ReadBuffer까지 다 해봤습니다...

    > 이걸 오해 하신건가여?

    >

    > 그리구여 ReadFileStream : File; 입니다..

    >

    > 지금두 헤메고 있는데..

    > Write메소드를 사용 하지 않은건 아닙니다...

    >

    > Ms.Write(buf, FileHader.BackImg.ImgSize) 하면 오류가 일어나고

    >

    > Ms.Write(buf[0], FileHader.BackImg.ImgSize) 하고난뒤 SaveFromStream하면 아무 내용도 있지 않습니다..

    >

    > 뭐가 잘못된건가여?

    >

    > 아님 다른 방법이라도 좋습니다..

    >

    > 김진호 wrote:

    > > 이런 경우 어떻게 합니까?

    > >

    > > 한개의 화일이 있습니다..

    > > 그 화일에는 헤더, JpgImage1, JpgImage2, JpgImage3 등이 들어 갑니다..

    > >

    > > 일단 저장에는 성공 했습니다..

    > >

    > > 읽어 들이는 부분이 문제 인데요..

    > >

    > > TJPEGImage에 있는 LoadFromStream이라는 메소드를 쓰고 싶습니다..

    > >

    > > LoadFromStream를 쓸려면 스트림 객체를 요구 하는데...

    > > 그래서 전 TMemoryStream를 선택 했습니다.

    > >

    > > 보시면 아시 겠지만 BlockRead의 함수를 사용해 Buf라는 포인터로 값을 읽어

    > > 오거든요..

    > > 근데 그걸 TMemoryStream에 쓸수 있는 방법이 없습니다..

    > >

    > >

    > > var Buf : PChar;

    > > i : integer;

    > > Jp : TJPEGImage;

    > > Ms : TMemoryStream;

    > > begin

    > > Ms := TMemoryStream.Create;

    > > jp := TJPEGImage.Create;

    > >

    > > OpenDialog1.InitialDir := ExtractFilePath(ParamStr(0));

    > > OpenDialog1.Filter := '*.jpg';

    > > if not OpenDialog1.Execute then OpenDialog1.FileName := '';

    > >

    > > //헤더를 읽는다.

    > > AssignFile(ReadFileStream, OpenDialog1.FileName);

    > > Reset(ReadFileStream, 1);

    > > BlockRead(ReadFileStream, FileHader, Sizeof(FileHader));

    > >

    > > //헤더를 제외한 실제 Jpg Data의 부분으로 분기 한다.

    > > Seek(ReadFileStream, Sizeof(FileHader) + 100);

    > >

    > > //헤더에 있는 싸이즈 만큼 읽는다..

    > > if FileHader.BackImg.ImgSize > 0 then

    > > begin

    > > GetMem(buf, FileHader.BackImg.ImgSize);

    > > ZeroMemory(buf, FileHader.BackImg.ImgSize);

    > > BlockRead(ReadFileStream, buf[0], FileHader.BackImg.ImgSize);

    > > // Ms.ReadBuffer(buf, FileHader.BackImg.ImgSize); --> 이부분

    > > FreeMem(buf, FileHader.BackImg.ImgSize);

    > > end;

    > >

    > > try

    > >

    > > finally

    > > CloseFile(ReadFileStream);

    > > end;

    > >

    > > 아시는 분은 답변좀 해주세요...

    > > 염치 없지만 감사 합니다..

    > >

  • Profile
    최용일 2000.06.22 10:16
    안녕하세요. 최용일입니다.



    스트림에 쓰는것이 아니라 스트림에서 읽어왔네요.



    스트림에 쓸때는 write... 메소드를 사용하세요.



    ^^ 항상 즐코하세요.



    김진호 wrote:

    > 이런 경우 어떻게 합니까?

    >

    > 한개의 화일이 있습니다..

    > 그 화일에는 헤더, JpgImage1, JpgImage2, JpgImage3 등이 들어 갑니다..

    >

    > 일단 저장에는 성공 했습니다..

    >

    > 읽어 들이는 부분이 문제 인데요..

    >

    > TJPEGImage에 있는 LoadFromStream이라는 메소드를 쓰고 싶습니다..

    >

    > LoadFromStream를 쓸려면 스트림 객체를 요구 하는데...

    > 그래서 전 TMemoryStream를 선택 했습니다.

    >

    > 보시면 아시 겠지만 BlockRead의 함수를 사용해 Buf라는 포인터로 값을 읽어

    > 오거든요..

    > 근데 그걸 TMemoryStream에 쓸수 있는 방법이 없습니다..

    >

    >

    > var Buf : PChar;

    > i : integer;

    > Jp : TJPEGImage;

    > Ms : TMemoryStream;

    > begin

    > Ms := TMemoryStream.Create;

    > jp := TJPEGImage.Create;

    >

    > OpenDialog1.InitialDir := ExtractFilePath(ParamStr(0));

    > OpenDialog1.Filter := '*.jpg';

    > if not OpenDialog1.Execute then OpenDialog1.FileName := '';

    >

    > //헤더를 읽는다.

    > AssignFile(ReadFileStream, OpenDialog1.FileName);

    > Reset(ReadFileStream, 1);

    > BlockRead(ReadFileStream, FileHader, Sizeof(FileHader));

    >

    > //헤더를 제외한 실제 Jpg Data의 부분으로 분기 한다.

    > Seek(ReadFileStream, Sizeof(FileHader) + 100);

    >

    > //헤더에 있는 싸이즈 만큼 읽는다..

    > if FileHader.BackImg.ImgSize > 0 then

    > begin

    > GetMem(buf, FileHader.BackImg.ImgSize);

    > ZeroMemory(buf, FileHader.BackImg.ImgSize);

    > BlockRead(ReadFileStream, buf[0], FileHader.BackImg.ImgSize);

    > // Ms.ReadBuffer(buf, FileHader.BackImg.ImgSize); --> 이부분

    > FreeMem(buf, FileHader.BackImg.ImgSize);

    > end;

    >

    > try

    >

    > finally

    > CloseFile(ReadFileStream);

    > end;

    >

    > 아시는 분은 답변좀 해주세요...

    > 염치 없지만 감사 합니다..

    >