본문 바로가기

프로그램 개발/델파이

델파이(delphi) 이미지 dll 리소스로 만들어 활용하기

728x90
반응형
델파이를 정리를 시작 한지 얼마 되지 않았는데 순서가 뒤죽 박죽 입니다.

델파이 설치하고 화면 구성 설명드리려고 했는데 커뮤니티 에디션이 설치가 안되서 뒤로 미루고 있습니다

지금 현재 XE2 버전을 사용 하고 있는데 이것과 충돌이 나서 설치가 잘 안되네요 

윈도우를 새로 설치할 예정이어서 설치 후에 차근차근 이어 가보도록 하겠습니다 

델파이 개발자들이 많이 줄었는데요 개인적으로 정리도 할겸 블로그도 만들겸 하고 있는중입니다 ~ ^^ 


------------------------------- 
시작합니다 ~ 

요즘 이 방식을 많이 사용 하는지 모르겠습니다. 
제가 최근에 사용한건 이미지작업을 해서 테마로 만들고 이걸 적용 하는 방식입니다 

최신 방식이 아니지만 참고 해주시면 고맙겠습니다 

[이미지] ---> 이미지.DLL 
먼저 프로젝트를 DLL 형태로 만듭니다 


신규 프로젝트를 만들기에 들어서 dynamic-link-Library (DLL) 을 선택하고 생성합니다 
그리고 이미지를 등록할 수 있는 *.rc 파일을 만들어서 추가힙니다 

rc 파일은 직접 코딩을 해주셔야 합니다 
test.dll 

4가지 종류의 파일을 준비해서 아래 형식으로 등록 합니다 
test_image.rc 
{
이름       파일형식    파일명 
LOGO     PNG      logo.png
LOADING  GIF      loading.gif
ACTION   JPEG     action.jpg
HELP     BMP      help.bmp
}


rc 파일은 내부적으로 Brcc32 로 컴파일 되어 Res 파일을 생성합니다 
그러면 Res 파일을 활용하여 DLL 파일을 생성하게 됩니다 
그러면 DLL 파일을 불러와서 각각의 이미지를 이름 으로 찾아 올 수 있게 되죠 



이렇게 해서 test.dll 파일을 미리 준비 해놓습니다 

같은 프로젝트 그룹으로 포함 할 수 도있지만 전 각각은 나누어 보여 드리기 위해 별도의 프로젝트를 생성하였습니다 

먼저 화면 디자인 입니다 
각각의 버튼을 클리하게 되면 이미지를 불러와 오른쪽 Timage 에 보여 주게 됩니다 


uses 에   Vcl.Imaging.pngimage,  Vcl.Imaging.jpeg, Vcl.Imaging.gifimg ; 이렇게 포함시켜 줘야 이미지를 컨트롤 할 수있습니다  ( XE2 기준) 


 DllHandle: THandle;

//폼이 생성 될때 dll 이미지를 불러와서 메모리에 저장합니다 
procedure TImageView.FormCreate(Sender: TObject);
begin
   DllHandle := LoadLibrary('test.dll');

  if DllHandle < HINSTANCE_ERROR then
  begin
    ShowMessage('DLL을 읽어올때 오류가  발생하였습니다');
    Exit;
  end;

end;

//----------------------------------------------------------------------------------
//PNG불러오기 버튼클리시 DllHandle 에서 LOLGO 라는 이미지를 가져옵니다  
procedure TImageView.BitBtn1Click(Sender: TObject);
var
  TmpGraphic : TGraphic;
  ResStream : TResourceStream;
begin
  ResStream := TResourceStream.Create(DllHandle, 'LOGO','PNG');
//PNG 이미지 그래픽을 만듬
  TmpGraphic := TPngImage.Create;

//ResourceStream 에 들어 있는 이미지를 TmpGraphic 에 로드 시킴
  TmpGraphic.LoadFromStream(ResStream);

//이미지 박스에 PNG 이미지를 적용
  Image1.Picture.Bitmap.Assign( TmpGraphic) ;

//메모리해제
  TmpGraphic.Free;

end;
dll 에 이미지가 들어 있지만 프로그램은 이게 어떤 형태인지 알수가 없습니다
그래서 이미지 타입에 맞게 변형을 해서 보여주게 됩니다 
나머지는 파일 형식만 달라지고 동일하다고 보시면 됩니다 
//----------------------------------------------------------------------------------

//JPEG 불러오기
procedure TImageView.BitBtn2Click(Sender: TObject);
var
  TmpGraphic : TGraphic;
  ResStream : TResourceStream;
begin
  ResStream := TResourceStream.Create(DllHandle, 'ACTION','JPEG');

  TmpGraphic := TJPEGImage.Create;
  TmpGraphic.LoadFromStream(ResStream);

  Image1.Picture.Bitmap.Assign( TmpGraphic) ;

  TmpGraphic.Free;

end;

//GIF 불러오기
procedure TImageView.BitBtn3Click(Sender: TObject);
var
  TmpGraphic : TGraphic;
  ResStream : TResourceStream;
begin
  ResStream := TResourceStream.Create(DllHandle, 'LOADING','GIF');

  TmpGraphic := TGIFImage.Create;
  TmpGraphic.LoadFromStream(ResStream);

  Image1.Picture.Bitmap.Assign( TmpGraphic) ;

  TmpGraphic.Free;
end;

//BMP 불러오기
procedure TImageView.BitBtn4Click(Sender: TObject);
var
  TmpGraphic : TGraphic;
  ResStream : TResourceStream;
begin
  ResStream := TResourceStream.Create(DllHandle, 'HELP','BMP');

  TmpGraphic := TBitmap.Create;

  TmpGraphic.LoadFromStream(ResStream);

  Image1.Picture.Bitmap.Assign( TmpGraphic) ;

  TmpGraphic.Free;

end;

//폼을 닫아줄때 메모리 해제
procedure TImageView.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeLibrary(DllHandle);
end;


실행된 화면입니다 



간단한 기능이지만 활용 하시면 좋은 프로그램을 개발 하실 수 있습니다 
그리고 원리를 알게 되면 다른 프로그램으로 개발 할때도 도움이 많이 됩니다 


여기까지 [이미지 dll 리소스로 만들어 불러 오기] 였습니다 ~ 




반응형