Q&A

  • DB의 그림 필드가 bmp인지? jpg인지?
안녕하세요.

오라클 DB에 사진이나 사인등이 저장되어 있습니다.

그런데 bmp와 jpg를 구분하지 않은 상태입니다.



새로운 서버로 옮기려 하는데 DB에서 읽어들일때 그 데이타가 bmp인지 jpg인지

알수 있는 방법이 없을까요? 부탁드립니다.

4  COMMENTS
  • Profile
    innover 2001.12.19 23:52
    델파이에서는 TPicture 가 이미지를 관리하는 컨테이너입니다.

    TPicture의 Graphic 프로퍼티의 클래스를 확인해서 종류를 알 수 있습니다.

    예를 들면 다음과 같이 할 수 있겠죠?



    if DBImage.Picture.Graphic is TJpegImage then ShowMessage('jpg');

    if DBImage.Picture.Graphic is TBitmap then ShowMessage('bmp');



    프로그램에서 다양하게 가변적인 클래스 종류를 확인하고 싶으시다면 ClassName 프로퍼티를 이용해보세요.



    ShowMessage('Picture has ' + DBImage.Picture.Graphic.ClassName);



    빙고 wrote:

    > 안녕하세요.

    > 오라클 DB에 사진이나 사인등이 저장되어 있습니다.

    > 그런데 bmp와 jpg를 구분하지 않은 상태입니다.

    >

    > 새로운 서버로 옮기려 하는데 DB에서 읽어들일때 그 데이타가 bmp인지 jpg인지

    > 알수 있는 방법이 없을까요? 부탁드립니다.

  • Profile
    빙고 2001.12.20 00:00
    답변주신거는 혹시 컴포넌트중 TDBImage를 쓰신경우인가요?

    전 그냥 기존 DB에서 Select 해와서 그걸 파일처리해서 직접 다른 서버에 Insert 하려고

    하거든요~

    그런 경우도 이렇게 하면 되나여?



    innover wrote:

    > 델파이에서는 TPicture 가 이미지를 관리하는 컨테이너입니다.

    > TPicture의 Graphic 프로퍼티의 클래스를 확인해서 종류를 알 수 있습니다.

    > 예를 들면 다음과 같이 할 수 있겠죠?

    >

    > if DBImage.Picture.Graphic is TJpegImage then ShowMessage('jpg');

    > if DBImage.Picture.Graphic is TBitmap then ShowMessage('bmp');

    >

    > 프로그램에서 다양하게 가변적인 클래스 종류를 확인하고 싶으시다면 ClassName 프로퍼티를 이용해보세요.

    >

    > ShowMessage('Picture has ' + DBImage.Picture.Graphic.ClassName);

    >





  • Profile
    전철호 2001.12.19 11:58
    // GIF, Jpeg 해더부분

    TGifHeader = packed record

    Signature : array[0..2] of char; { contains 'GIF' }

    Version : TGIFVersionRec; { '87a' or '89a' }

    end;



    TJpegHeader = packed record

    StartImage : Word; // unsigned Short Int (2byte)

    Reserved : Word; // unsigned Short Int (2byte)

    Reserved2 : Word; // unsigned Short Int (2byte)

    JpegFormat : array[0..13] of Char;

    end;



    // 다음은 GIF,JPEG, Bitmap인지를 판단하여 TImage에 보여주는 부분입니다.

    procedure ReadPicCheck(Stream: TStream; var Buffer; Size: LongInt);

    var

    ReadSize : integer;

    begin

    ReadSize := Stream.Read(Buffer, Size);

    if (ReadSize <> Size) then

    MessageDlg('그래픽 스트림을 읽을 수 없습니다 !!.',mtWarning,[mbOK],0);

    end;



    procedure TMainForm.GetPicture(pstdno : string);

    var

    G : TStream;

    Tmp : TStream;

    GifHeader : TGifHeader;

    JpegHeader : TJpegHeader;

    begin

    with DM.Qry1 do

    begin

    Close;

    Sql.Clear;

    Sql.Add('SELECT * FROM stmphoto '+

    ' WHERE stdno = :lstdno ');

    ParamByName('lstdno').AsString := DM.Qry2.FieldByName('stdno').AsString;

    Open;



    if not Eof then

    begin

    G := CreateBlobStream(TBlobField(FieldByName('stdphoto')),bmRead);

    G.Seek(0,soFromBeginning);

    ReadPicCheck(G, GifHeader, Sizeof(GifHeader));

    if (UpperCase(GifHeader.Signature) = 'GIF') then

    begin

    // 이부분에서 GIF 이미지를 읽어들이면 됩니다.

    end

    else

    begin

    G.Seek(0,soFromBeginning);

    ReadPicCheck(G, JpegHeader, Sizeof(JpegHeader));

    if (JpegHeader.StartImage <> $d8ff) and (JpegHeader.Reserved <> $e0ff) then

    begin

    Img_stdphoto.Picture.Assign(FieldByName('stdphoto'));

    end

    else

    begin

    // 이부분에서 Jpeg 이미지를 읽어들이면 됩니다.

    end;

    end;

    FPicIns := False;

    end

    else

    begin

    Img_stdphoto.Picture.Assign(Img_Temp.Picture);

    FPicIns := True;

    end;

    Close;

    end;

    end;

  • Profile
    빙고 2001.12.19 23:55
    전철호님 답변주셔서 감사합니다.

    그런데요 죄송하게도 제가 모자라다보니 이해를 잘 못하겠어여..흐흑



    한 서버에 사진 테이블이 있고요, 거기서 Select 해와서 그 테이블의 그림필드가

    jpg 이면 어떠한 변환작업을 한 후/Bmp 이면 그냥 또 다른 서버의 사진 테이블에

    구분을 줘서 저장하려하거든요!



    jpg나 bmp중 하나를 알면 else 써서 다른건 jpg가 아니면 btm처리 식으로 하려는데

    님의 소스를 보고서 아무리 궁리를 해도 머리가 딸아주지 않아서리..흐흑



    님의 답변을 잘 숙지못하여 죄송한데 좀 쉽게 가르쳐주시면 감사하겠습니다.

    죄송합니다.