GIF 이미지 애니메이션

사용자 삽입 이미지Delphi와 C++Builder의 2007 버전부터는 GIF 이미지가 지원됩니다. 그전까지는 ico, wmf/emf, bmp 외에는 jpg만 지원되었는데요. jpg도 많이 쓰이는 포맷이긴 하지만, 버튼의 아이콘 표시 등에는 적절하지 못하기 때문에 보통 gif나 png를 더 많이 쓰지요.

델파이/C++빌더 2009 버전부터 PNG를 기본 지원하게 되었고, GIF에서 지원하는 대부분의 기능들을 PNG에서 지원하고 PNG가 대부분의 경우 GIF보다 기능이 더 뛰어나기 때문에 웬만해서는 PNG를 제쳐 두고 GIF를 쓸 일은 없어졌습니다.

(VCL에서 GIF 지원은 Anders Melander 씨가 TGIFImage를 코드기어에 기부한 것이고, PNG 지원은 Gustavo Daud 씨의 TPNGImage를 코드기어가 사들인 것입니다)

하지만, PNG로는 대체가 안되는, 꼭 GIF 이미지를 써야만 하는 경우가 딱 한가지 있는데요. 바로 애니메이션입니다. PNG에는 GIF의 애니메이션 표준이 없거든요. (애니메이션을 위한 PNG의 변형 스펙이 있기는 하지만 PNG 표준의 일부는 아닙니다)

물론 이런 애니메이션을 위해 플래시를 쓸 수도 있습니다만.. 플래시가 더 역동적이고 화려한 효과를 보여줄 수 있기는 해도, 플래시 자체가 별도로 설치되어 있어야만 하는데다가 너무 무겁고 CPU 자원도 많이 소모하죠. 그래서 GIF 애니메이션 정도로 처리할 수 있는 간단한 동작에 플래시를 올리는 것은 배보다 배꼽이 더 크다고 할 수 있겠습니다.

어쨌든… 델파이와 C++빌더의 2007 이상에서는 gif가 기본 지원되므로, TImage 등 TPicture 타입의 속성을 가진 컴포넌트에 비트맵이나 jpg 이미지처럼 gif 이미지도 간단히 올려놓을 수 있습니다. 그런데, 이렇게 해서 실행해보면, 디자인타임에서 돌아가지 않음은 물론, 실행했을 때 런타임에도 애니메이션이 동작하지 않습니다. 첫번째 프레임의 이미지만 나타날 뿐, 일정 시간마다 돌아가는 애니메이션 효과가 나타나지 않죠.

TGIFImage의 원작자인 Anders Melander 씨에 의하면, 기본적으로 gif 애니메이션이 동작하지 않게 한 것은 실수가 아니라 의도적인 것이라고 합니다. 다른 이미지 포맷들도 기본적으로 움직이지 않으니까 그랬다고 하네요.

이런 TGIFImage 이미지의 애니메니션이 동작하도록 하는 방법은 두 가지가 있는데요. 첫번째로, 각각의 이미지별로(컴포넌트마다 따로) 움직이게 하는 방법입니다. TGIFImage 클래스에 Animate 속성이 있으므로, 이 값을 true로 설정하면 됩니다.

(짐작하시겠지만, 첫 라인의 if 문은 gif 이미지가 맞는지를 런타임에 확인하기 위한 코드이므로, 확실히 gif 이미지가 올라가있는 경우라면 필요하지 않겠지요.)

다른 한가지 방법은, 애플리케이션 전역적으로 모든 TGIFImage 객체들에서 기본적으로 애니메이션이 동작하도록 하는 방법입니다. GIF 지원을 위한 유닛인 GIFImg에 GIFImageDefaultAnimate라는 불린 타입의 전역 변수가 있는데, 이 값을 true로 설정해주면 됩니다.

그런데, 흔히 생각하는 것처럼 폼의 OnCreate 이벤트나 폼 클래스의 생성자 등에서 이 값을 설정해주는 경우, 폼의 코드에서 동적으로 gif를 로드했을 때는 잘 처리됩니다만, 디자인타임에 폼에 gif 이미지를 올려놓은 경우에는 애니메이션이 적용되지 않습니다. 이것은, GIF 이미지가 로딩되기 전에 GIFImageDefaultAnimate 변수 값이 설정되어 있어야 하는데, 폼의 컴포넌트 로딩이 다 끝난 후에야 OnCreate가 발생하기 때문입니다. (생성자의 경우에는 컴포넌트 로딩보다 먼저 시작되기는 하지만 늦게 끝납니다)

따라서, 폼 디자이너에서 정적으로 gif 이미지를 올려놓은 경우라면 해당 폼의 OnCreate가 아니라 그보다 먼저 실행될 지점에서 이 값을 설정해줘야 합니다. 간단하게 생각해보면 두가지 방법이 있을텐데요, 하나는 프로젝트의 메인 소스에서 메인 폼의 초기화보다 앞에서 이 코드를 추가하는 방법이 있겠고, 다른 한가지 방법은 폼 유닛의 initialization 섹션에서 실행해주는 것입니다.

(C++빌더에서 델파이의 initialization 효과를 내기 위해서는 예전에 볼랜드포럼 팁으로 올렸던 다음의 글을 참고하세요. http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=584 )

참고로, GIF 이미지의 투명 효과를 설정하는 방법도 거의 동일합니다. TGIFImage 클래스에 Transparent 속성이 있고, 마찬가지로 전역 변수로 GIFImageDefaultTransparent 변수가 있답니다.

답글 남기기

이메일 주소는 공개되지 않습니다.