화니 님이 쓰신 글 :
: 안녕하세요~
: 이미지 image 컴포넌트를 사용하여 파일이미지들을 표시해주는 단순한
: 것을 만들어 사용하려고 하는데요
: 당황스럽게 tif 확장자 파일이 있는데 파일하나에 여러장이 저장이되어져 있네요
: 아무리 해봐도 첫장만 표시가 되어지네요 며칠을 해보다가 질의 남겨 봅니다.
: 여러장인 경우 어찌 표시 할수 있는 방법이 있는지 혹 하신 분들 도움 부탁드립니다...
: 감사합니다.~
답변:
VCL도 라이브러리 내부적으로는 Windows OS가 제공하는 WIC API를 사용합니다.
procedure TWICImage.LoadFromStream(Stream: TStream);
var
LStream: IStream;
BitmapDecoder: IWICBitmapDecoder;
LBitmapFrame: IWICBitmapFrameDecode;
LGUID: TGUID;
procedure WicCheck(Result: HRESULT);
begin
if Failed(Result) then
raise EInvalidGraphic.Create(SInvalidImage);
end;
begin
FreeAndNil(FBitmap);
FData.Clear;
FData.CopyFrom(Stream, Stream.Size - Stream.Position);
FData.Position := 0;
LStream := TStreamAdapter.Create(FData);
WicCheck(FImagingFactory.CreateDecoderFromStream(LStream, guid_null, WICDecodeMetadataCacheOnDemand, BitmapDecoder));
WicCheck(BitmapDecoder.GetContainerFormat(LGUID));
EncoderContainerFormat := LGUID;
WicCheck(BitmapDecoder.GetFrame(0, LBitmapFrame));
WicCheck(FImagingFactory.CreateBitmapFromSource(LBitmapFrame, WICBitmapCacheOnLoad, FWicBitmap));
WicCheck(FWicBitmap.GetSize(FWidth, FHeight));
FFormatChanged := False;
end;
확장자 tiff 이미지 파일일 경우, TWICImage 클래스로 바인딩 하는데...
위의 VCL 소스코드를 보면 알 수 있듯이 OS의 WIC API를 이용하고 있고...
VCL은 무조건 첫번째 프레임만 처리하고 멀티플 이미지에 대해선 코드를 따로 구현해 놓고 있지 않습니다.
위의 TWICImage.LoadFromStream()를 수정해서 처리하든가 하면 되겠죠. ( GetFrame() WIC COM API )
컴포넌트에만 의존하고... API 찾아 볼 생각도 안하고 VCL 소스코드도 안예 안보나요?
|