Q&A

  • JPG파일을 MS-SQL (3-tire) image 필드에 저장 및 불러오기
고수님들 도와주세염..ㅠ.ㅠ
전 초보입니당..
클라이언트 - 서버 용 프로그램을 개발중이에요..

현재 이미지파일(*.jpg) 을 image 컴포넌트(Delphi)를 이용해서
Server 에( MS-SQL 2000 ) 에 Table1을 만들고 필드명을 IMG 라고 하고 필드형식을 IMAGE 로 선언하였습니다.
그런다음.. 첫번째 Server 의Table1.. IMG 필드에 저장하려고 하고
두번째  DBimage(Delphi) 컴포넌트를 사용해서 화면에서 저장된
이미지 파일(*.jpg)을 확인하려 합니다.
저장 시킬때는 Table 컴포넌트(Delphi)를 이용하려 합니다.
어떻게 해야할지요?
정말 초보라서 아무것도 몰라요..자세한 설명 부탁드립니다.
4  COMMENTS
  • Profile
    Galaxy 2003.09.29 21:40
    반갑습니다.
    수고 많습니다.
    저도 JPG 이미지 처리때문에 고생을 했습니다.
    질답에 검색을 통하여 여러 답을 구했지만 JPG는 잘 되지가 않더라구요
    내가 실력이 없어 그런가 봐요 그래서 저는 저희 회사 모든 그림은 BMP로
    바꾸어 습니다. 모든 문제가 해결 되었습니다.
    그러나 JPG이미지 도 해결 해야 되는데....

    ------ save------
    TBlobField(ParamByNAme('MATR_IMAGE')).assign(Image10.Picture.Bitmap);

    ------- select ------
    if (FieldByNAme('MATR_IMFILE').asstring <> '') then
        Image10.Picture.Bitmap.Assign(FieldByName('MATR_IMAGE'))
    else
         Image10.Picture:=nil;


    아래 답변은 제가 작성 한것이 아닙니다.
    질답 검색에 얻어온 답변 입니다.
    아무쪼로 도움이 많이 되시길 바랍니다.
    그럼 수고 하세요

    ********************************************************************



    이명근 wrote:




    저도 이곳에서 자료를 찾아 어제 완성한 부분인데요..
    시간이 없어 코드를 그냥 올립니다. 양해바랍니다.
    아래는 JPG를 테이블과 TImage 콤포넌트에서
    서로 주고 받는 소스입니다.

    TDBImage를 직접 사용하면 화면에 보여질 때
    이미지 크기가 큰 것은 제대로 보이질 않더군요
    그래서 아래의 방법을 이용하면 잘됩니다.

    다른 자료는 검색을 해보세요!

    -----------------------------
    1.JPG --> DB 저장하기
    -----------------------------
    procedure TFormDocSign.BtnSaveClick(Sender: TObject);
    var JobMode: TTableJobMode;
       JpegImage: TJpegImage;
       MS: TMemoryStream;
    begin
      BtnSave.Enabled := False;

      eDOCLICNO.Text := Trim(eDOCLICNO.Text  );
      eNAME.Text     := Trim(eNAME.Text);

      try
         if Length(eDOCLICNO.Text) < 0 then begin
            eDOCLICNO.SetFocus;
            raise EUserDefError.CreateHelp('면허번호는 필수입력 항목입니다.'+#10+'재입력하십시요.', -1)
         end;

         JobMode := TableJobMode('DOCSIGN',eDOCLICNO.Text);
         with DM.Query do begin
            SQL.Clear;

            if      JobMode = tjmInsert then begin
               SQL.Add('insert into DOCSIGN');
               SQL.Add('(DOCLICNO, NAME, SIGN)');
               SQL.Add('values(:DOCLICNO, :NAME, :SIGN)');
            end
            else if JobMode = tjmUpdate then begin
               SQL.Add('update DOCSIGN set');
               SQL.Add('NAME=:NAME,SIGN=:SIGN');
               SQL.Add('where DOCLICNO=:DOCLICNO');
            end
            else begin
               raise EUserDefError.CreateHelp('', -1)
            end;

            ParamByName('DOCLICNO').AsString := eDOCLICNO.Text;
            ParamByName('NAME').AsString     := eNAME.Text;

            JpegImage := TJpegImage.Create;
            MS        := TMemoryStream.Create;

            if ImageMap.Picture.Graphic = nil then begin
               ParamByName('SIGN').Assign(ImageMAP.Picture.Bitmap);  //널일경우
            end
            else begin
               JpegImage.Assign(ImageMap.Picture.Graphic);
               MS.Position:=0;
               JpegImage.SaveToStream(MS);
               ParamByName('SIGN').LoadFromStream(MS,ftBlob);
            end;
            JpegImage.Destroy;
            MS.Destroy;

            DM.DB.StartTransaction;
            ExecSQL;
            DM.DB.Commit;
            GetQueryList('DOCLICNO',eDOCLICNO.Text);
         end;
      except
         on E: Exception do begin
            if DM.DB.InTransaction then DM.DB.Rollback;
            MessageBox(E.Message+#10#10+'Error Code : '+IntToStr(E.HelpContext),'오류', 16);
         end;
      end;
      BtnSave.Enabled := True;  
    end;

    -----------------------------
    [2. DB --> TImage]
    -----------------------------
    procedure TFormDocSign.DBGridListRowChange(Sender: TObject);
    var
      BitmapImage: TJPEGImage;
      MS: TMemoryStream;
    begin
      with DBGridList.DataSource.DataSet do begin
         if IsEmpty then exit;

         eDOCLICNO.Text    := FieldByName('DOCLICNO').AsString;
         eNAME.Text        := FieldByName('NAME').AsString;

         if FieldByName('SIGN').IsNull then begin
            ImageMap.Picture.Assign(nil);
         end
         else begin
            BitmapImage := TJPEGImage.Create;
            MS          := TMemoryStream.Create;
            (FieldByName('SIGN') As TBlobField).SaveToStream(MS);
            MS.Position:=0;
            BitmapImage.LoadFromStream(MS);
            ImageMap.Picture.Assign(BitmapImage);

            BitmapImage.Destroy;
            MS.Destroy;
            ImageMap.Stretch := PanelEdit.Height < ImageMap.Picture.Height;
         end;
      end;
    end;


    --------------------- end of 답변 ---------------

    ********************************************************************
  • Profile
    윤지현 2003.10.08 21:28

    어쩔수 없이 변환해서 저장해야 겠습니다.
    암튼 감사드리구여 ^^*
    고생을 덜 하게 되서 고맙습니다..꾸벅^^
    근데....저장되어 있는 이미지를 화면상에 뿌리니깐..
    (처음 저장시 화면에 잘 보였습니다.(image  컴포넌트))
    저장된 이미지를 불러보니깐 이미지 밑부분이 시커먼 색으로
    잘려서 보입니다..
    해결방법은 없습니까?

  • Profile
    김유신 2003.10.28 19:02
    이미지 밑부분이 까맣게 보이는 현상은
    BDE Administrator 의 설정 내용중
    blob size 와 blob cache 의 사이즈를 늘려주면 해결됩니다.

    예를들어 32 -> 64 또는 1024...


  • Profile
    윤지현 2003.10.08 01:50
    정말 감사합니다..^^*
    함 열심히 해보겠습니다.
    그럼 수고하세용~~