안녕하세요 메르세데스입니다.


델파이 유 경험자라면.. QuickReport하면 노가다중에 상 노가다 라는것을 잘 알고 계실 것입니다. 지금이야.. 생산성이 높은 리포트 컴포넌트들이 즐비하지만.. 예전에 만들어졌었던 퀵리포트폼이나 혹.. 개발중이신 것을 종이 용지로 출력 하는것이야 문제가 되지 않지만..  무슨 특별한 작업을 위해  이미지로 변환해야 한다면..  고민에 빠지게 됩니다.


물론 가상의 프린터방식을 통해서 종이출력이 아닌 JPG나 TIF, PDF 형식으로 뽑아내는것도 가능하긴 하지만..  


제일 가까운 예로는 한글을 설치하면 자동으로 깔리는 PDF드라이버가있죠... 


하지만... 무료로 제공하는 소프트웨어에는 제약사항이 많이 있습니다.    


 가령 예를 든다면..  인쇄시..  매번 파일이름을 정해줘야 한다던가..     해상도.. 생성되는 결과물의 크기와 같은것의 핸들링이 잘 안되기 때문에 ..  다 필요없고 팝업안뜨고 알아서 한꺼번에 저장되기만하면..  바랄게 없을텐데...ㅜㅜ


결국에는 LEAD TOOLS같은 기능이 많은 상용컴포넌트쪽에 손이 가는일은 당연한 일이 됩니다. 하지만 라이선스의 문제가 있으니 사업장에서 사용하실려면 정품구매가 필수입니다.


하지만.. 조금만 관심을 갖는다면 비록 QuickReport일 지라도 기본기능에 충실한 상태에서 JPG 같은 이미지를 생성할 수 있습니다.


구글에서 검색을 해보면.. 비트맵으로 생성하는 방법이 나옵니다..   하지만 경우에 따라 bitMap의 특성상 파일 사이즈의 문제를 해결해야하는 경우가 있습니다. 2가지를 해결해보도록 하겠습니다.



일단 델파이 폼의  uses절에 JPEG를 추가시켜주시고요..


아래처럼 작성해봤습니다.


TBitMpap , TJpegImage 타입의 변수를 선언하고.. 


퀵리포트의 출력대신..    Qrit.Prepare 문 이후에   TBitMap 타입으로 만든 bitMap변수에  Canvas.Draw( ....  ) 이런식으로 영역을 받아오고..    


비트맵 혹은 JEPG타입이기 때문에  SaveToFile('해당경로및이름');  이렇게 저장을 하면 되는것이죠!  순식간에 만들어집니다.




퀵리포트를 이미지로만들기



이렇게 만들어진 BMP형식의 그림은 생각보다 용량이 크기때문에    JPEG-TYPE으로 형변환? 을 시켜 저장하는 것입니다.


vJpg.Assign(bitMap)  이렇게 코딩하면 됩니다.


만들어진 두 file의 사이즈를 비교해보면..    3.4MB와..  129KB로 확연한 차이가 나타납니다.     


첫번째 만들어진  aaab.jpg는 실제 BMP파일 입니다.    



비트맵은 사이즈가 매우크다


소스상에서 jpg로 변환이 가능하며 사이즈 대폭감소


생각보다 수고를 안들이고 쉽게 변환이 가능합니다. 결과물의 화질도 살펴보면..  나쁘지 않습니다.


그리고 좋은점은.. 제공하는 여러 함수나 프로시저를 이용해서 크기나 퀄리티등을 상황에 맞게 손 볼 수 있고..   저장시 SaveToStream처럼.. 하드디스크상에 저장하지 않고 메모리상에 스크림으로 처리할 수 있습니다.  사실 결과물을  디스크의 file로 떨어뜨리는게 나쁜방식은 아니지만, 작업시 하드디스크IO가 분명 발생하게 됩니다.비교적 단순하고 간단한 작업이라면 큰 문제가되지 않겠지만.. 다량의 반복 적인 작업엔 하드디스크의 성능이 따라 결과가 달라지겠죠....  반대로 메모리가 넉넉치 않다면 이로인한 문제가 발생될 수 있습니다. 상황에 맞는 사용이 필요합니다.  


아무튼 상황에 맞게 유연하게 처리가 가능하다는 것입니다.


상용컴포넌트 없이도 그리고 출력용 드라이버가 없어도 간단하게 소스몇줄이면 QuickReport가 imagefile로 변환이 가능하니 유용한 팁이 될 거라 생각합니다. 감사합니다.




참조: http://www.delphigroups.info/2/7/359610.html




블로그 이미지

delphi개발자 메르세데쓰

C#,delphi,db,network,server,it 개발자 메르세데스입니다

Tag

댓글을 달아 주세요

  • bjcha99@naver.com 2016.10.07 11:30 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? 검색하다 들어오게 되어 좋은 팁 잘 봤습니다.

    여러 장일 경우에도 한 파일에 저장이 될까요? 안 되겠죠? ^^

    혹시 아시면 답변 부탁드립니다.

    • Favicon of http://alolomersedess.tistory.com BlogIcon delphi개발자 메르세데쓰 2016.10.09 08:37 신고  댓글주소  수정/삭제

      안녕하세요 같은 델파이를 사용하는 분이어서 반갑습니다.

      여러페이지의 출력물을 하나의 이미지파일로 만들고 싶어하시는 것이네요.

      일단 제가 찾아보니 퀵리포트에서 제공하는 함수나 프로시저로는 쉽지 않아보입니다.

      하지만 찾아보면 방법이 없는것은 아닙니다. TBitmap을 merge하면 될 것같네요.

      비슷한 고민을 하는 분이 있네요. 아래 링크를 확인해보세요..
      http://www.delphigroups.info/2/8/309463.html

      잘 해결되기를 바릅니다~

  • 하지만 2018.01.25 18:44 신고  댓글주소  수정/삭제  댓글쓰기

    품질이 현저하게 떨어지는데 방법이 없을까요... 방법을 모르겠군요...

    • Favicon of http://alolomersedess.tistory.com BlogIcon delphi개발자 메르세데쓰 2018.01.25 18:58 신고  댓글주소  수정/삭제

      압축률을 조절하실 수 있을겁니다. 함수가 있을거에요..

      리포트의 실 사이즈보다 크게 이미지를 만드는것도 방법이 될 수 있습니다.

      TMetafile을 이용하는 방법입니다.

      퀵리포트로부터 메타파일을 생성하여 사이즈를 키우는 것입니다. 다만 이미지와같은 것은 해당사항이 없습니다.

      var
      MF : TMetafile;
      begin
      ..

      BMP:=TBitMap.Create;
      MF := QuickRep1.QRPrinter.GetPage(i);

      //폭과 너비를 키움..
      MF.Width := MF.Width *2;
      MF.Height := MF.Height*2;

      BMP.Width := Round(MF.Width);
      BMP.Height := Round(MF.Height);
      BMP.Canvas.Draw(0, 0,MF);
      ...

      아니면 png라이브러리 같은걸 이용하시는 것도 방법이 될 수 있습니다. png는 무손실이니까요.. 결과물의 사이즈는 BMP 보다 작고 JPG보단 컸었습니다.

      uses pngimage

      var
      Bmp: TBitMap;
      PNG: TPNGObject;
      ...
      begin

      ...

      BMP:=TBitMap.Create;
      PNG := TPNGObject.Create;

      ..
      PNG.Assign(BMP);
      PNG.CompressionLevel :=9; //압축률..

      PNG.SaveToFile ...

  • 감사합니다 2018.02.01 10:49 신고  댓글주소  수정/삭제  댓글쓰기

    조언 감사합니다. 내용 추가 해주셨네요. =bbb
    하지만 퀄리티는 딱히 나아지지 않네요...

    저도 며칠째, 엄청난 경우의 수를 적용해 시도해봤지만 안되는 것으로 보아
    제 퀵레포트 버전이 낮아서 그렇다는 결론이 나고 있습니다. (델파이6, QR 3.6.2)
    즉, 원판이 문제...

    아무래도 다른 방법을 써야겠어요.

    QR->Image 보다는 QR->Metafile 자체로 Export
     or
    프린터 드라이버 단에서 File 로 Save

    위 두가지의 대안을 찾아야 되는걸로 결론이 나고 있습니다.

    아무쪼록 도움 주셔서 감사합니다 :)


    • Favicon of http://alolomersedess.tistory.com BlogIcon delphi개발자 메르세데쓰 2018.02.01 11:21 신고  댓글주소  수정/삭제

      네 그러시군요..

      저도 많은 시행착오를 겪었는데 결과가 잘 나왔습니다.

      png로 만드는 것으로 현재 사용중입니다.

      오픈소스로 돌아다니는..
      pngimage.pas 를 라이브러리에 추가하시면.. 비트맵을 PNG형식으로 저장하실 수 있을겁니다.

      Metafile로 받아 출력물의 사이즈를 2배로 키운 후 png로 저장하는 방식으로 사용중에 있습니다.

      무손실 압축이라.. 저장물의 파일 사이즈도 만족스럽습니다..

      저는 현재 델파이7 환경이지만.. png를 적용하였을 때 환경이 델6이었지요..

      조금만 더 하시면 좋은 결과가 있으실것 같아 아쉬워서 댓글을 더 달아봅니다~

  • 감사합니다 2018.02.01 14:14 신고  댓글주소  수정/삭제  댓글쓰기


    PNGImage 는
    http://proger.i-forge.net/Компьютер/Delphi/[20120225]%20Useful%20Delphi%20packages/
    를 사용했습니다.
    물론, 메르세데스님과 같은 코드로 적용했습니다. ( 구현 소스가 딱히 바뀔게 없어요 :) )

    음..
    근데 그러고보니........

    제가 하는 작업은 파일생성하여 화면상에서 확인해야할 결과물이 아니라 실제 종이 인쇄상태의 결과물의 퀄리티가 좋아야하는 작업입니다.
    All Text 와 Shape 로 이루어진, 인쇄했을때 책보듯 또렷하게 나와야 하는 문서거든요.

    그 점에서 오는 괴리가 아닐까 하는 생각입니다.

    • Favicon of http://alolomersedess.tistory.com BlogIcon delphi개발자 메르세데쓰 2018.02.01 15:17 신고  댓글주소  수정/삭제

      네.. ^^

      이미지파일로 만드신다길래 출력을 안하시려는 줄 알았습니다.

      가장좋은것은.. QuickReport를 그냥 출력하는것이겠죠..

      근데..출력을 위해 이미지파일로 만드시는게 무슨 이유가 있으신거겠죠..?

      선명한 출력물을 원하신다면.. 출력물이 이미지형태가 아닌 메타파일형 이어야 할텐데요.. 예를들어 XML,HTML,PDF,DOC.. 처럼요..

      결과물이 꼭 이미지파일이어야 한다면 쉽지 않을 것 같다는 생각이듭니다. 그게 아니라면 ..

      이미 알고계시겠지만..
      QuickRep1.ExportToFilter( .. ) 로 만드셔야 할 것 같습니다.

      참조: http://www.quickreport.co.uk/WebInfoPage.aspx?WebInfoID=11520

  • 감사합니다 2018.02.01 18:12 신고  댓글주소  수정/삭제  댓글쓰기

    금방 예상하실 수 있듯이,
    프로그램 사용자는 문서를 파일로 생성하여 다른 곳에 발송하고 수신측에서는 파일을 출력해 써야하기 때문이구요...

    [ DPI ] 를 높일 수 있는 방법이 있다면 Export 로 쉽게 구현해서 작업을 끝내버리려는 저의 무지의 시작(?)에서 비롯된 것이었었는데...
    결국엔 불가능함을 격하게 체험하고(ㅠㅠ) gg... 기 말씀드린 두가지 방 식중에서 선택해야 함을 깨달았습니다.

    QRPDFFilt 를 추가해서 PDF 로 생성해보니 원했던 퀄리티는 나오는데 한글이 죄다 깨지는 현상이 발생하네요(멘붕).
    (ex. ¸¼ÃÊμ¿1326¿Ü 3ÇÊÁö )
    구글링해보니 이 깨짐 증상 역시 해결방법이 없다는 것 같네요. (ㅋㅋㅋㅋㅋㅋㅋ)
    결국 다른 메타파일이나 프린터 단으로 고려중입니다.

    프린터로 파일 생성해서 써드파티 프로그램을 강제 동원해서 변환을 해볼까요... @@

    걍 유료 컴포넌트를 써볼까... 골치 썩네요ㅋ;;

    ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

    • Favicon of http://alolomersedess.tistory.com BlogIcon delphi개발자 메르세데쓰 2018.02.02 16:11 신고  댓글주소  수정/삭제

      옛날기억이 납니다...ㅜㅜ
      2~3년전즘 QuickReport를 PDF로 출력하는 문제 때문에 알아본 적이 있었습니다. 제 직장상사분께서 PDF로 문서를 만들면서 암호화시키는 문제로 고민하고 계셨었거든요..
      그때 잘안되서.. XE버전으로 DLL모듈을 개발해서 QuickRep를 파라미터로 받아 처리했었던 기억이 납니다. 그때 제가 내렸던 결론은.. 하위버전 델파이는.. 유니코드기반이 아니기 때문에 한글깨지는 문제가 해결안되는거 같네? 였습니다. QuickReport Export를 썼었던 기억이 나는데 이것도 반쪽짜리인 이유가.. 결과물을 확대하면 글자가 뭉개져버리는 타입의 야매? pdf였습니다. 그땐 이거라도 되기만 하면 그냥 써야했던 상황이어서 그냥 그대로..? 마무리 지었었습니다.

      빠른해결을 위해선..말씀대로.. 상용컴포넌트 혹은.. 프린터드라이버를 알아보시는게 좋으실텐데요.. 이것도 100% 만족하는 것을 찾으시려면.. 생각보단 만만치 않으실겁니다. 컴포넌트를 쓰실거면.. 퀵리포트와 인터페이스가 되는.. eDOCENGINE 좋아보이긴 하는데.. 혹시 도움이 되실까 적어봅니다. 아무튼 좋은 결과 있으시기를 바랍니다. ^^