Animated PNG graphics

  • 리비전 슬러그: Animated_PNG_graphics
  • 리비전 제목: Animated PNG graphics
  • 리비전 아이디: 173508
  • 제작일시:
  • 만든이: Jeongkyu
  • 현재 리비전인가요? 아니오
  • 댓글 /* 'acTL': The Animation Control Chunk 번역*/

리비전 내용

{{template.Fx_minversion_header(3)}}

작성자

APNG 명세의 작성자는 다음과 같습니다:

  • Stuart Parmenter <pavlov@pavlov.net>
  • Vladimir Vukicevic <vladimir@pobox.com>
  • Andrew Smith <asmith15@littlesvr.ca>


개요

APNG는 움직이는 이미지에 대한 지원을 추가한 이식가능한 네트워크 그래픽 (PNG) 포맷의 확장입니다. 이는 전통적으로 GIF 포맷을 사용했던 간단한 움직이는 이미지를 대체하기 위한 것이며 24비트 이미지와 8비트 투명도 지원을 추가하고 있습니다. APNG는 MNG에 대한 보다 간단한 대안으로서 인터넷 상에서 움직이는 이미지의 가장 일반적인 사용에 적합한 명세를 제공하고 있습니다.

APNG는 PNG와 후위 호환이 가능(backwards-compatible)합니다. 즉, 모든 PNG 디코더는 APNG 특정 청크를 무시하고 단일 이미지를 표시할 수 있어야 합니다.

용어

기본 이미지(default image)는 표준 'IDAT' 청크가 기술하는 이미지로서 APNG를 지원하지 않는 디코더가 표시하는 이미지입니다.

캔버스(canvas)는 프레임이 표시되는 출력 장치의 영역입니다. 디코더가 꼭 출력 버퍼의 내용을 이용할 수 있는 것은 아닙니다. PNG 명세에 따르면 선택할 만한 바탕이 없는 경우 'bKGD' 청크가 존재하면 이를 캔버스를 채우는데 사용하게 됩니다.

출력 버퍼(output buffer)는 PNG 'IHDR' 청크의 너비와 높이 매개 변수로 지정된 치수를 가진 픽셀 배열입니다. 개념적으로 각 프레임은 캔버스에서 조합되기 전에 출력 버퍼에서 구성됩니다. 디코더는 출력 버퍼의 내용을 이용할 수 있습니다. 출력 버퍼의 모퉁이는 캔버스의 모퉁이에 대응됩니다.

완전 투명 흑색(Fully transparent black)은 적색, 녹색, 청색, 투명 요소가 모두 0으로 설정된 것을 의미합니다.

청크를 기술할 때, unsigned int는 0부터 (2^31)-1 범위로 제한된 네트워크 바이트 순서를 따르는 32비트 부호없는 정수입니다. unsigned short는 0부터 (2^16)-1 범위의 네트워크 바이트 순서를 따르는 16비트 부호없는 정수입니다. byte는 0부터 (2^8)-1 범위의 8비트 부호없는 정수입니다.

오류 처리

APNG는 전체 이미지를 읽기 전에 점증적인 프레임 표시가 가능하도록 설계되었습니다. 그러므로 애니메이션이 일정 부분 진행될 때까지 오류가 발견되지 않을 수도 있습니다. 오류가 발생하는 경우, 디코더는 그 후의 모든 프레임을 버리고 애니메이션을 멈추고 기본 이미지를 표시하는 것으로 돌아가야 합니다. 디코더가 애니매이션을 시작하기 전에 오류를 발견하면 기본 이미지를 표시해야 합니다. 적합한 경우에는 오류 메시지를 사용자에게 표시할 수도 있습니다.

구조

APNG 스트림은 PNG 명세에 정의된 일반적인 PNG 스트림으로서 애니메이션을 기술하고 부가적인 프레임 자료를 제공하는 세 개의 추가 청크 형식을 포함합니다.

APNG로 인식되려면 'acTL' 청크가 'IDAT' 청크보다 먼저 스트림에 나타나야 합니다. 'acTL' 구조는 아래에서 설명하고 있습니다.

개념적으로 각 재연의 처음에 출력 버퍼는 'IHDR' 청크의 너비와 높이 치수를 따르는 완전 투명 흑색 직사각형으로 완전하게 초기화되어야 합니다.

'IDAT' 이전에 단일 'fcTL' 청크가 있으면 기본 이미지는 애니메이션의 첫 번째 프레임으로 포함됩니다. 그렇지 않으면, 기본 이미지는 애니메이션의 일부가 아닙니다.

그 후 프레임은 순서 번호가 앞에 나오는 것을 제외하면 'IDAT' 청크와 같은 구조를 가진 'fdAT' 청크에 인코드됩니다. 배치와 렌더링에 관한 각 프레임에 대한 정보는 'fcTL' 청크에 저장됩니다. 'fdAT'와 'fcTL' 청크의 전체 레이아웃은 아래에서 설명하고 있습니다.

전체 애니메이션의 경계는 기본 이미지가 애니메이션의 일부인지와 상관없이 PNG 'IHDR' 청크의 너비와 높이 매개 변수에 따라 지정됩니다. 나중 프레임에 추가 공간이 필요하면 기본 이미지에는 완전 투명 흑색 픽셀을 덧대야 합니다.

각 프레임은 각 재연에 대해 동일하므로 애플리케이션이 프레임을 캐시하는 것은 안전합니다.

청크 순서 번호

'fcTL'과 'fdAT' 청크는 4바이트 순서 번호를 가지고 있습니다. 두 청크 형식은 순서를 공유합니다. 이 번호의 목적은 APNG의 순서 오류를 감지(하고 선택에 따라 수정)하는 것입니다. PNG 명세는 부수적인 청크에 순서의 제약을 부여하지 않기 때문입니다.

첫 번째 'fcTL' 청크는 순서 번호 0을 꼭 포함하고 나머지 'fcTL'과 'fdAT' 청크의 순서 번호는 공백이나 중복없이 순서대로 되어야 합니다.

아래 표는 하나 이상의 프레임과 하나 이상의 'fdAT' 청크를 포함한 이미지에 대한 순서 번호 사용을 보여줍니다.

기본 이미지가 첫 번째 프레임인 경우:

순서 번호 청크
(없음) 'acTL'
0 'fcTL' (첫 번째 프레임)
(없음) 'IDAT' (첫 번째 프레임 -- 기본 이미지로 사용)
1 'fcTL' (두 번째 프레임)
2 'fdAT' (두 번째 프레임을 위한 첫 번째 'fDAT')
3 'fdAT' (두 번째 프레임을 위한 두 번째 'fDAT')
... ...

기본 이미지가 애니메이션의 일부분이 아닌 경우:

순서 번호 청크
(없음) 'acTL'
(없음) 'IDAT' (기본 이미지)
0 'fcTL' (첫 번째 프레임)
1 첫 번째 프레임을 위한 첫 번째 'fdAT'
2 첫 번째 프레임을 위한 두 번째 'fDAT'
... ...

디코더는 순서가 잘못된 APNG 청크를 오류로 처리해야 합니다. APNG를 인식하는 PNG 편집기는 순서 번호를 이용하여 올바른 순서로 복구해야 합니다.

'acTL': 애니메이션 제어(Animation Control) 청크

'acTL' 청크는 PNG 명세에 정의된 부수적인 청크입니다. 이는 올바른 PNG 스트림에서 첫 번째 'IDAT' 청크 앞에 나와야 합니다.

'acTL' 청크는 다음과 같은 필드를 포함합니다.

바이트 오프셋 필드 이름 필드 형식 설명
0 num_frames unsigned int APNG의 프레임 수.
4 num_plays unsigned int APNG 반복 횟수. 0은 무한 반복을 가리킴.

num_frames은 애니메이션의 전체 프레임 수를 가리킵니다. 이 값은 'fcTL' 청크의 개수와 같아야 합니다. 0은 올바른 값이 아닙니다. 1은 단일 프레임 APNG에 대해 올바른 값입니다. 이 값이 실제 프레임의 개수와 다른 경우, 이는 오류로 처리해야 합니다.

num_plays은 애니메이션을 재생하는 횟수를 가리킵니다. 이 값이 0이면 애니메이션을 계속 재생해야 합니다. 0이 아니면 애니메애션은 마지막 재생의 최종 프레임에서 멈춰야 합니다.

'fcTL': The Frame Control Chunk

The 'fcTL' chunk is an ancillary chunk as defined in the PNG Specification. It must appear before the 'IDAT' or 'fdAT' chunks of the frame to which it applies, specifically:

  • For the default image, if a 'fcTL' chunk is present it must appear before the first 'IDAT' chunk. Position relative to the 'acTL' chunk is not specified.
  • For the first frame excluding the default image (which may be either the first or second frame), the 'fcTL' chunk must appear after all 'IDAT' chunks and before the 'fdAT' chunks for the frame.
  • For all subsequent frames, the 'fcTL' chunk for frame N must appear after the 'fdAT' chunks from frame N-1 and before the 'fdAT' chunks for frame N.
  • Other ancillary chunks are allowed to appear among the APNG chunks, including between 'fdAT' chunks.

Exactly one 'fcTL' chunk is required for each frame.

Byte offset Field name Field type Description
0 sequence_number unsigned int Sequence number of the animation chunk, starting with 0.
4 width unsigned int Width of the following frame.
8 height unsigned int Height of the following frame.
12 x_offset unsigned int X position at which to render the following frame.
16 y_offset unsigned int Y position at which to render the following frame.
20 delay_num unsigned short Frame delay fraction numerator.
22 delay_den unsigned short Frame delay fraction denominator.
24 dispose_op byte Type of frame area disposal to be done after rendering this frame.
25 blend_op byte Type of frame area rendering for this frame.

The frame must be rendered within the region defined by x_offset, y_offset, width, and height. The offsets must be non-negative, the dimensions must be positive, and the region may not fall outside of the default image.

Constraints on frame regions:

  • x_offset >= 0
  • y_offset >= 0
  • width > 0
  • height > 0
  • x_offset + width <= 'IHDR' width
  • y_offset + height <= 'IHDR' height

The delay_num and delay_den parameters together specify a fraction indicating the time to display the current frame, in seconds. If the denominator is 0, it is to be treated as if it were 100 (that is, delay_num then specifies 1/100ths of a second). If the the value of the numerator is 0 the decoder should render the next frame as quickly as possible, though viewers may impose a reasonable lower bound.

Frame timings should be independent of the time required for decoding and display of each frame, so that animations will run at the same rate regardless of the performance of the decoder implementation.

dispose_op specifies how the output buffer should be changed at the end of the delay (before rendering the next frame).

Valid values for dispose_op are:

Value Constant Description
0 APNG_DISPOSE_OP_NONE No disposal is done on this frame before rendering the next; the contents of the output buffer are left as is.
1 APNG_DISPOSE_OP_BACKGROUND The frame's region of the output buffer is to be cleared to fully transparent black before rendering the next frame.
2 APNG_DISPOSE_OP_PREVIOUS The frame's region of the output buffer is to be reverted to the previous contents before rendering the next frame.

If the first 'fcTL' chunk uses a dispose_op of APNG_DISPOSE_OP_PREVIOUS it should be treated as APNG_DISPOSE_OP_BACKGROUND.

blend_op<code> specifies whether the frame is to be alpha blended into the current output buffer content, or whether it should completely replace its region in the output buffer.

Valid values for <code>blend_op are:

Value Constant Description
0 APNG_BLEND_OP_SOURCE All color components of the frame, including alpha, overwrite the current contents of the frame's output buffer region.
1 APNG_BLEND_OP_OVER The frame should be composited onto the output buffer based on its alpha, using a simple OVER operation as described in the Alpha Channel Processing section of the Extensions to the PNG Specification, Version 1.2.0. Note that the second variation of the sample code is applicable.

Note that for the first frame the two blend modes are functionally equivalent due to the clearing of the output buffer at the beginning of each play.

The 'fcTL' chunk corresponding to the default image, if it exists, has these restrictions:

  • The x_offset and y_offset fields must be 0.
  • The width and height fields must equal the corresponding fields from the 'IHDR' chunk.

As noted earlier, the output buffer must be completely initialized to fully transparent black at the beginning of each play. This is to ensure that each play of the animation will be identical. Decoders are free to avoid an explicit clear step as long as the result is guaranteed to be identical. For example, if the default image is included in the animation, and uses a blend_op of APNG_BLEND_OP_SOURCE, clearing is not necessary because the entire output buffer will be overwritten.

'fdAT': The Frame Data Chunk

The 'fdAT' chunk has the same purpose as an 'IDAT' chunk. It has the same structure as an 'IDAT' chunk, except preceded by a sequence number.

At least one 'fdAT' chunk is required for each frame. The compressed datastream is then the concatenation of the contents of the data fields of all the 'fdAT' chunks within a frame. When decompressed, the datastream is the complete pixel data of a PNG image, including the filter byte at the beginning of each scanline, similar to the uncompressed data of all the 'IDAT' chunks. It utilizes the same bit depth, color type, compression method, filter method, interlace method, and palette (if any) as the default image.

Byte offset Field name Field type Description
0 sequence_number unsigned int Sequence number of the animation chunk, starting from 0.
4 frame_data X bytes Frame data for this frame.

Each frame inherits every property specified by any critical or ancillary chunks before the first 'IDAT' in the file, except the width and height, which come from the 'fcTL' chunk.

If the PNG 'pHYs' chunk is present, the APNG images and their x_offset and y_offset values must be scaled in the same way as the main image. Conceptually, such scaling occurs while mapping the output buffer onto the canvas.

Revisions to this specification

From 0.1

  • Renamed chunks to 'anIm' and 'frAm' to comply with chunk naming conventions in the PNG spec.
  • Added a more detailed explanation of APNG structure in Section 2.
  • Added information for png interaction with other chunks in section 3.2.
  • Changed 'frAm' chunk offsets and delay into signed integers.

From 0.2

  • Changed 'frAm' chunk to 'afRa' to avoid conflict with MNG 'FRAM' chunk.
  • Changed format: instead of sequences of IHDR..IDAT..IEND, frames other than frame 0 are stored in 'afRa' chunks.
  • Added start_frame to 'anIm' to indicate which frame the animation should start on.
  • Removed num_frames from 'anIm' chunk

From 0.3

  • Added 'aCTL', 'fdAT', 'fcTL' chunk descriptions as per the latest png-list discussion
  • Added section 4, "Interactions with other PNG chunks"; described global and local palettes and transparency
  • Changed 'oFFs' chunk section to refer to more general chunks
  • Updated 'aDAT' description to indicate that all frames must either be in a single chunk, or that the first chunk must have empty data.
  • Added notice that each frame's region (x,y,width,height) must lie completely within the parent PNG canvas
  • Fixed dispose_op description (after, not before)
  • Changed dispose_op to render_op; added disposal description; added BLEND flag
  • Changed delay_time to a delay numerator and denominator, for specifying delays that don't into integer numbers of milliseconds.
  • Added note to clarify that palette animation is not supported.
  • Removed start_frame from aCTL; require fcTL for frame 0; added SKIP_FRAME fCTL flag.

From 0.4

  • Reintroduced num_frames into aCTL
  • Moved sequence_number from aDAT into fCTL
  • Changed contents of aDAT to fCTL+IDATs+fEND
  • Added clarifications on what's allowed and what isn't
  • Renamed aCTL to acTL, fCTL to fcTL, aDAT to fdAT and fEND to feND to comply with the PNG spec chunk naming requirements

From 0.5

  • Added the IHDR and PLTE CRCs to the acTl chunk
  • The acTL fcTL and adAT are now copy safe, renamed them to acTl, fcTl and adAt

From 0.6

  • The fdAt chunk is no longer a container for other chunks, but rather a replacement for an IDAT chunk
  • Removed the feND chunk
  • Added a sequence number field to fdAt
  • Reintroduced the width and height fields in fcTl

From 0.7

  • Removed hidden flag, instead only the first frame can be hidden and it is signaled with a missing fcTl
  • IDAT, fcTl and fdAt are no longer required to have no other chunks in between them

From 0.8

  • Removed CRCs for IHDR and PLTE from acTl
  • The acTL fcTL and adAT are now not copy safe, renamed them to acTL, fcTL and adAT

From 0.9

  • Split render_op into dispose_op and blend_op

From 0.10

  • No changes

Test Encoder and Sample Images

Sample images are available from the APNG implementation page at http://littlesvr.ca/apng/

An encoder (open source) is available in versions of the Gecko engine starting with version 1.9 alpha 4.

An application (open source) using the Mozilla encoder to assemble APNGs available here: http://littlesvr.ca/apng/apngedit.html

See also


{{ wiki.languages( { "es": "es/Gr\u00e1ficos_PNG_animados", "fr": "fr/Images_PNG_anim\u00e9es" } ) }}

리비전 소스

<p>{{template.Fx_minversion_header(3)}}
</p>
<h3 name=".EC.9E.91.EC.84.B1.EC.9E.90">작성자</h3>
<p>APNG 명세의 작성자는 다음과 같습니다:
</p>
<ul><li> Stuart Parmenter &lt;pavlov@pavlov.net&gt;
</li><li> Vladimir Vukicevic &lt;vladimir@pobox.com&gt;
</li><li> Andrew Smith &lt;asmith15@littlesvr.ca&gt;
</li></ul>
<p><br>
</p>
<h3 name=".EA.B0.9C.EC.9A.94">개요</h3>
<p>APNG는 움직이는 이미지에 대한 지원을 추가한 <a class="external" href="http://www.w3.org/TR/PNG/">이식가능한 네트워크 그래픽</a> (PNG) 포맷의 확장입니다. 이는 전통적으로 <a class="external" href="http://www.w3.org/Graphics/GIF/spec-gif89a.txt">GIF</a> 포맷을 사용했던 간단한 움직이는 이미지를 대체하기 위한 것이며 24비트 이미지와 8비트 투명도 지원을 추가하고 있습니다. APNG는 MNG에 대한 보다 간단한 대안으로서 인터넷 상에서 움직이는 이미지의 가장 일반적인 사용에 적합한 명세를 제공하고 있습니다.
</p><p>APNG는 PNG와 후위 호환이 가능(backwards-compatible)합니다. 즉, 모든 PNG 디코더는 APNG 특정 청크를 무시하고 단일 이미지를 표시할 수 있어야 합니다.
</p>
<h4 name=".EC.9A.A9.EC.96.B4">용어</h4>
<p><b>기본 이미지(default image)</b>는 표준 'IDAT' 청크가 기술하는 이미지로서 APNG를 지원하지 않는 디코더가 표시하는 이미지입니다.
</p><p><b>캔버스(canvas)</b>는 프레임이 표시되는 출력 장치의 영역입니다. 디코더가 꼭 출력 버퍼의 내용을 이용할 수 있는 것은 아닙니다. PNG 명세에 따르면 선택할 만한 바탕이 없는 경우 'bKGD' 청크가 존재하면 이를 캔버스를 채우는데 사용하게 됩니다.
</p><p><b>출력 버퍼(output buffer)</b>는 PNG 'IHDR' 청크의 너비와 높이 매개 변수로 지정된 치수를 가진 픽셀 배열입니다. 개념적으로 각 프레임은 캔버스에서 조합되기 전에 출력 버퍼에서 구성됩니다. 디코더는 출력 버퍼의 내용을 이용할 수 있습니다. 출력 버퍼의 모퉁이는 캔버스의 모퉁이에 대응됩니다.
</p><p><b>완전 투명 흑색(Fully transparent black)</b>은 적색, 녹색, 청색, 투명 요소가 모두 0으로 설정된 것을 의미합니다.
</p><p>청크를 기술할 때, <code><b>unsigned int</b></code>는 0부터 (2^31)-1 범위로 제한된 네트워크 바이트 순서를 따르는 32비트 부호없는 정수입니다. <code><b>unsigned short</b></code>는 0부터 (2^16)-1 범위의 네트워크 바이트 순서를 따르는 16비트 부호없는 정수입니다. <code><b>byte</b></code>는 0부터 (2^8)-1 범위의 8비트 부호없는 정수입니다.
</p>
<h4 name=".EC.98.A4.EB.A5.98_.EC.B2.98.EB.A6.AC">오류 처리</h4>
<p>APNG는 전체 이미지를 읽기 전에 점증적인 프레임 표시가 가능하도록 설계되었습니다. 그러므로 애니메이션이 일정 부분 진행될 때까지 오류가 발견되지 않을 수도 있습니다. 오류가 발생하는 경우, 디코더는 그 후의 모든 프레임을 버리고 애니메이션을 멈추고 기본 이미지를 표시하는 것으로 돌아가야 합니다. 디코더가 애니매이션을 시작하기 전에 오류를 발견하면 기본 이미지를 표시해야 합니다. 적합한 경우에는 오류 메시지를 사용자에게 표시할 수도 있습니다.
</p>
<h3 name=".EA.B5.AC.EC.A1.B0">구조</h3>
<p>APNG 스트림은 <a class="external" href="http://www.w3.org/TR/PNG/">PNG 명세</a>에 정의된 일반적인 PNG 스트림으로서 애니메이션을 기술하고 부가적인 프레임 자료를 제공하는 세 개의 추가 청크 형식을 포함합니다. 
</p><p>APNG로 인식되려면 'acTL' 청크가 'IDAT' 청크보다 먼저 스트림에 나타나야 합니다. 'acTL' 구조는 아래에서 설명하고 있습니다.
</p><p>개념적으로 각 재연의 처음에 출력 버퍼는 'IHDR' 청크의 너비와 높이 치수를 따르는 완전 투명 흑색 직사각형으로 완전하게 초기화되어야 합니다.
</p><p>'IDAT' 이전에 단일 'fcTL' 청크가 있으면 기본 이미지는 애니메이션의 첫 번째 프레임으로 포함됩니다. 그렇지 않으면, 기본 이미지는 애니메이션의 일부가 아닙니다. 
</p><p>그 후 프레임은 순서 번호가 앞에 나오는 것을 제외하면 'IDAT' 청크와 같은 구조를 가진 'fdAT' 청크에 인코드됩니다. 배치와 렌더링에 관한 각 프레임에 대한 정보는 'fcTL' 청크에 저장됩니다. 'fdAT'와 'fcTL' 청크의 전체 레이아웃은 아래에서 설명하고 있습니다.
</p><p>전체 애니메이션의 경계는 기본 이미지가 애니메이션의 일부인지와 상관없이 PNG 'IHDR' 청크의 너비와 높이 매개 변수에 따라 지정됩니다. 나중 프레임에 추가 공간이 필요하면 기본 이미지에는 완전 투명 흑색 픽셀을 덧대야 합니다.
</p><p>각 프레임은 각 재연에 대해 동일하므로 애플리케이션이 프레임을 캐시하는 것은 안전합니다.
</p>
<h3 name=".EC.B2.AD.ED.81.AC_.EC.88.9C.EC.84.9C_.EB.B2.88.ED.98.B8">청크 순서 번호</h3>
<p>'fcTL'과 'fdAT' 청크는 4바이트 순서 번호를 가지고 있습니다. 두 청크 형식은 순서를 공유합니다. 이 번호의 목적은 APNG의 순서 오류를 감지(하고 선택에 따라 수정)하는 것입니다. PNG 명세는 부수적인 청크에 순서의 제약을 부여하지 않기 때문입니다.
</p><p>첫 번째 'fcTL' 청크는 순서 번호 0을 꼭 포함하고 나머지 'fcTL'과 'fdAT' 청크의 순서 번호는 공백이나 중복없이 순서대로 되어야 합니다.
</p><p>아래 표는 하나 이상의 프레임과 하나 이상의 'fdAT' 청크를 포함한 이미지에 대한 순서 번호 사용을 보여줍니다.
</p><p><b>기본 이미지가 첫 번째 프레임인 경우:</b>
</p>
<table class="standard-table">

<tbody><tr>
<th>순서 번호
</th><th>청크
</th></tr>
<tr>
<td>(없음)
</td><td>'acTL'
</td></tr>
<tr>
<td>0
</td><td>'fcTL' (첫 번째 프레임)
</td></tr>
<tr>
<td>(없음)
</td><td>'IDAT' (첫 번째 프레임 -- 기본 이미지로 사용)
</td></tr>
<tr>
<td>1
</td><td>'fcTL' (두 번째 프레임)
</td></tr>
<tr>
<td>2
</td><td>'fdAT' (두 번째 프레임을 위한 첫 번째 'fDAT')
</td></tr>
<tr>
<td>3
</td><td>'fdAT' (두 번째 프레임을 위한 두 번째 'fDAT')
</td></tr>
<tr>
<td>...
</td><td>...
</td></tr>
</tbody></table>
<p><b>기본 이미지가 애니메이션의 일부분이 아닌 경우:</b>
</p>
<table class="standard-table">

<tbody><tr>
<th>순서 번호
</th><th>청크
</th></tr>
<tr>
<td>(없음)
</td><td>'acTL'
</td></tr>
<tr>
<td>(없음)
</td><td>'IDAT' (기본 이미지)
</td></tr>
<tr>
<td>0
</td><td>'fcTL' (첫 번째 프레임)
</td></tr>
<tr>
<td>1
</td><td>첫 번째 프레임을 위한 첫 번째 'fdAT'
</td></tr>
<tr>
<td>2
</td><td>첫 번째 프레임을 위한 두 번째 'fDAT'
</td></tr>
<tr>
<td>...
</td><td>...
</td></tr>
</tbody></table>
<p>디코더는 순서가 잘못된 APNG 청크를 오류로 처리해야 합니다. APNG를 인식하는 PNG 편집기는 순서 번호를 이용하여 올바른 순서로 복구해야 합니다.
</p>
<h3 name=".27acTL.27:_.EC.95.A0.EB.8B.88.EB.A9.94.EC.9D.B4.EC.85.98_.EC.A0.9C.EC.96.B4.28Animation_Control.29_.EC.B2.AD.ED.81.AC">'acTL': 애니메이션 제어(Animation Control) 청크</h3>
<p>'acTL' 청크는 PNG 명세에 정의된 부수적인 청크입니다. 이는 올바른 PNG 스트림에서 첫 번째 'IDAT' 청크 앞에 나와야 합니다.
</p><p>'acTL' 청크는 다음과 같은 필드를 포함합니다.
</p>
<table class="standard-table">

<tbody><tr>
<th>바이트 오프셋
</th><th>필드 이름
</th><th>필드 형식
</th><th>설명
</th></tr>
<tr>
<td>0
</td><td><code>num_frames</code>
</td><td><code>unsigned int</code>
</td><td>APNG의 프레임 수.
</td></tr>
<tr>
<td>4
</td><td><code>num_plays</code>
</td><td><code>unsigned int</code>
</td><td>APNG 반복 횟수.  0은 무한 반복을 가리킴.
</td></tr>
</tbody></table>
<p><code>num_frames</code>은 애니메이션의 전체 프레임 수를 가리킵니다. 이 값은 'fcTL' 청크의 개수와 같아야 합니다. 0은 올바른 값이 아닙니다. 1은 단일 프레임 APNG에 대해 올바른 값입니다. 이 값이 실제 프레임의 개수와 다른 경우, 이는 오류로 처리해야 합니다.
</p><p><code>num_plays</code>은 애니메이션을 재생하는 횟수를 가리킵니다. 이 값이 0이면 애니메이션을 계속 재생해야 합니다. 0이 아니면 애니메애션은 마지막 재생의 최종 프레임에서 멈춰야 합니다.
</p>
<h3 name=".27fcTL.27:_The_Frame_Control_Chunk">'fcTL': The Frame Control Chunk</h3>
<p>The 'fcTL' chunk is an ancillary chunk as defined in the PNG Specification. It must appear before the 'IDAT' or 'fdAT' chunks of the frame to which it applies, specifically:
</p>
<ul><li> For the default image, if a 'fcTL' chunk is present it must appear before the first 'IDAT' chunk. Position relative to the 'acTL' chunk is not specified.
</li><li> For the first frame excluding the default image (which may be either the first or second frame), the 'fcTL' chunk must appear after all 'IDAT' chunks and before the 'fdAT' chunks for the frame.
</li><li> For all subsequent frames, the 'fcTL' chunk for frame N must appear after the 'fdAT' chunks from frame N-1 and before the 'fdAT' chunks for frame N.
</li><li> Other ancillary chunks are allowed to appear among the APNG chunks, including between 'fdAT' chunks.
</li></ul>
<p>Exactly one 'fcTL' chunk is required for each frame.
</p>
<table class="standard-table">

<tbody><tr>
<th>Byte offset
</th><th>Field name
</th><th>Field type
</th><th>Description
</th></tr>
<tr>
<td>0
</td><td><code>sequence_number</code>
</td><td><code>unsigned int</code>
</td><td>Sequence number of the animation chunk, starting with 0.
</td></tr>
<tr>
<td>4
</td><td><code>width</code>
</td><td><code>unsigned int</code>
</td><td>Width of the following frame.
</td></tr>
<tr>
<td>8
</td><td><code>height</code>
</td><td><code>unsigned int</code>
</td><td>Height of the following frame.
</td></tr>
<tr>
<td>12
</td><td><code>x_offset</code>
</td><td><code>unsigned int</code>
</td><td>X position at which to render the following frame.
</td></tr>
<tr>
<td>16
</td><td><code>y_offset</code>
</td><td><code>unsigned int</code>
</td><td>Y position at which to render the following frame.
</td></tr>
<tr>
<td>20
</td><td><code>delay_num</code>
</td><td><code>unsigned short</code>
</td><td>Frame delay fraction numerator.
</td></tr>
<tr>
<td>22
</td><td><code>delay_den</code>
</td><td><code>unsigned short</code>
</td><td>Frame delay fraction denominator.
</td></tr>
<tr>
<td>24
</td><td><code>dispose_op</code>
</td><td><code>byte</code>
</td><td>Type of frame area disposal to be done after rendering this frame.
</td></tr>
<tr>
<td>25
</td><td><code>blend_op</code>
</td><td><code>byte</code>
</td><td>Type of frame area rendering for this frame.
</td></tr>
</tbody></table>
<p>The frame must be rendered within the region defined by <code>x_offset</code>, <code>y_offset</code>, <code>width</code>, and <code>height</code>. The offsets must be non-negative, the dimensions must be positive, and the region may not fall outside of the default image.
</p><p>Constraints on frame regions:
</p>
<ul><li><code>x_offset</code> &gt;= 0
</li><li><code>y_offset</code> &gt;= 0
</li><li><code>width</code> &gt; 0
</li><li><code>height</code> &gt; 0
</li><li><code>x_offset</code> + <code>width</code>  &lt;= 'IHDR' width
</li><li><code>y_offset</code> + <code>height</code> &lt;= 'IHDR' height
</li></ul>
<p>The <code>delay_num</code> and <code>delay_den</code> parameters together specify a fraction indicating the time to display the current frame, in seconds.  If the denominator is 0, it is to be treated as if it were 100 (that is, <code>delay_num</code> then specifies 1/100ths of a second).  If the the value of the numerator is 0 the decoder should render the next frame as quickly as possible, though viewers may impose a reasonable lower bound.
</p><p>Frame timings should be independent of the time required for decoding and display of each frame, so that animations will run at the same rate regardless of the performance of the decoder implementation.
</p><p><code>dispose_op</code> specifies how the output buffer should be changed at the end of the delay (before rendering the next frame).
</p><p>Valid values for <code>dispose_op</code> are:
</p>
<table class="standard-table">

<tbody><tr>
<th>Value
</th><th>Constant
</th><th>Description
</th></tr>
<tr>
<td>0
</td><td><code>APNG_DISPOSE_OP_NONE</code>
</td><td>No disposal is done on this frame before rendering the next; the contents of the output buffer are left as is.
</td></tr>
<tr>
<td>1
</td><td><code>APNG_DISPOSE_OP_BACKGROUND</code>
</td><td>The frame's region of the output buffer is to be cleared to fully transparent black before rendering the next frame.
</td></tr>
<tr>
<td>2
</td><td><code>APNG_DISPOSE_OP_PREVIOUS</code>
</td><td>The frame's region of the output buffer is to be reverted to the previous contents before rendering the next frame.
</td></tr>
</tbody></table>
<p>If the first 'fcTL' chunk uses a <code>dispose_op</code> of <code>APNG_DISPOSE_OP_PREVIOUS</code> it should be treated as <code>APNG_DISPOSE_OP_BACKGROUND</code>.
</p><p><code>blend_op&lt;code&gt; specifies whether the frame is to be alpha blended into the current output buffer content, or whether it should completely replace its region in the output buffer.
</code></p><p>Valid values for &lt;code&gt;blend_op are:
</p>
<table class="standard-table">

<tbody><tr>
<th>Value
</th><th>Constant
</th><th>Description
</th></tr>
<tr>
<td>0
</td><td><code>APNG_BLEND_OP_SOURCE</code>
</td><td>All color components of the frame, including alpha, overwrite the current contents of the frame's output buffer region.
</td></tr>
<tr>
<td>1
</td><td><code>APNG_BLEND_OP_OVER</code>
</td><td>The frame should be composited onto the output buffer based on its alpha, using a simple OVER operation as described in the <a class="external" href="http://pmt.sourceforge.net/specs/png-1.2-pdg.html#D.Alpha-channel-processing">Alpha Channel Processing</a> section of the <a class="external" href="http://pmt.sourceforge.net/specs/png-1.2-pdg.html">Extensions to the PNG Specification, Version 1.2.0</a>. Note that the second variation of the sample code is applicable.
</td></tr>
</tbody></table>
<p>Note that for the first frame the two blend modes are functionally equivalent due to the clearing of the output buffer at the beginning of each play.
</p><p>The 'fcTL' chunk corresponding to the default image, if it exists, has these restrictions:
</p>
<ul><li> The <code>x_offset</code> and <code>y_offset</code> fields must be 0.
</li><li> The <code>width</code> and <code>height</code> fields must equal the corresponding fields from the 'IHDR' chunk.
</li></ul>
<p>As noted earlier, the output buffer must be completely initialized to fully transparent black at the beginning of each play. This is to ensure that each play of the animation will be identical. Decoders are free to avoid an explicit clear step as long as the result is guaranteed to be identical. For example, if the default image is included in the animation, and uses a <code>blend_op</code> of <code>APNG_BLEND_OP_SOURCE</code>, clearing is not necessary because the entire output buffer will be overwritten.
</p>
<h3 name=".27fdAT.27:_The_Frame_Data_Chunk">'fdAT': The Frame Data Chunk</h3>
<p>The 'fdAT' chunk has the same purpose as an 'IDAT' chunk. It has the same structure as an 'IDAT' chunk, except preceded by a sequence number.
</p><p>At least one 'fdAT' chunk is required for each frame. The compressed datastream is then the concatenation of the contents of the data fields of all the 'fdAT' chunks within a frame. When decompressed, the datastream is the complete pixel data of a PNG image, including the filter byte at the beginning of each scanline, similar to the uncompressed data of all the 'IDAT' chunks. It utilizes the same bit depth, color type, compression method, filter method, interlace method, and palette (if any) as the default image.
</p>
<table class="standard-table">

<tbody><tr>
<th>Byte offset
</th><th>Field name
</th><th>Field type
</th><th>Description
</th></tr>
<tr>
<td>0
</td><td><code>sequence_number</code>
</td><td><code>unsigned int</code>
</td><td>Sequence number of the animation chunk, starting from 0.
</td></tr>
<tr>
<td>4
</td><td><code>frame_data</code>
</td><td>X <code>bytes</code>
</td><td>Frame data for this frame.
</td></tr>
</tbody></table>
<p>Each frame inherits every property specified by any critical or ancillary chunks before the first 'IDAT' in the file, except the width and height, which come from the 'fcTL' chunk.
</p><p>If the PNG 'pHYs' chunk is present, the APNG images and their <code>x_offset</code> and <code>y_offset</code> values must be scaled in the same way as the main image. Conceptually, such scaling occurs while mapping the output buffer onto the canvas.
</p>
<h3 name="Revisions_to_this_specification">Revisions to this specification</h3>
<h4 name="From_0.1"> From 0.1 </h4>
<ul><li> Renamed chunks to 'anIm' and 'frAm' to comply with chunk naming conventions in  the PNG spec.
</li></ul>
<ul><li> Added a more detailed explanation of APNG structure in Section 2.
</li></ul>
<ul><li> Added information for png interaction with other chunks in section 3.2.
</li></ul>
<ul><li> Changed 'frAm' chunk offsets and delay into signed integers.
</li></ul>
<h4 name="From_0.2"> From 0.2 </h4>
<ul><li> Changed 'frAm' chunk to 'afRa' to avoid conflict with MNG 'FRAM' chunk.
</li></ul>
<ul><li> Changed format: instead of sequences of IHDR..IDAT..IEND, frames other than frame 0 are stored in 'afRa' chunks.
</li></ul>
<ul><li> Added <code>start_frame</code> to 'anIm' to indicate which frame the animation should start on.
</li></ul>
<ul><li> Removed <code>num_frames</code> from 'anIm' chunk
</li></ul>
<h4 name="From_0.3"> From 0.3 </h4>
<ul><li> Added 'aCTL', 'fdAT', 'fcTL' chunk descriptions as per the latest png-list discussion
</li></ul>
<ul><li> Added section 4, "Interactions with other PNG chunks"; described global and local palettes and transparency
</li></ul>
<ul><li> Changed 'oFFs' chunk section to refer to more general chunks
</li></ul>
<ul><li> Updated 'aDAT' description to indicate that all frames must either be in a single chunk, or that the first chunk must have empty data.
</li></ul>
<ul><li> Added notice that each frame's region (x,y,width,height) must lie completely within the parent PNG canvas
</li></ul>
<ul><li> Fixed <code>dispose_op</code> description (after, not before)
</li></ul>
<ul><li> Changed <code>dispose_op</code> to <code>render_op</code>; added disposal description; added <code>BLEND</code> flag
</li></ul>
<ul><li> Changed <code>delay_time</code> to a delay numerator and denominator, for specifying delays that don't into integer numbers of milliseconds.
</li></ul>
<ul><li> Added note to clarify that palette animation is not supported.
</li></ul>
<ul><li> Removed <code>start_frame</code> from aCTL; require fcTL for frame 0; added <code>SKIP_FRAME</code> fCTL flag.
</li></ul>
<h4 name="From_0.4"> From 0.4 </h4>
<ul><li> Reintroduced <code>num_frames</code> into aCTL
</li></ul>
<ul><li> Moved <code>sequence_number</code> from aDAT into fCTL
</li></ul>
<ul><li> Changed contents of aDAT to fCTL+IDATs+fEND
</li></ul>
<ul><li> Added clarifications on what's allowed and what isn't
</li></ul>
<ul><li> Renamed aCTL to acTL, fCTL to fcTL, aDAT to fdAT and fEND to feND to comply with the PNG spec chunk naming requirements
</li></ul>
<h4 name="From_0.5"> From 0.5 </h4>
<ul><li> Added the IHDR and PLTE CRCs to the acTl chunk
</li></ul>
<ul><li> The acTL fcTL and adAT are now copy safe, renamed them to acTl, fcTl and adAt
</li></ul>
<h4 name="From_0.6"> From 0.6 </h4>
<ul><li> The fdAt chunk is no longer a container for other chunks, but rather a replacement for an IDAT chunk
</li></ul>
<ul><li> Removed the feND chunk
</li></ul>
<ul><li> Added a sequence number field to fdAt
</li></ul>
<ul><li> Reintroduced the <code>width</code> and <code>height</code> fields in fcTl
</li></ul>
<h4 name="From_0.7"> From 0.7 </h4>
<ul><li> Removed <code>hidden</code> flag, instead only the first frame can be hidden and it is signaled with a missing fcTl
</li></ul>
<ul><li> IDAT, fcTl and fdAt are no longer required to have no other chunks in between them
</li></ul>
<h4 name="From_0.8"> From 0.8 </h4>
<ul><li> Removed CRCs for IHDR and PLTE from acTl
</li></ul>
<ul><li> The acTL fcTL and adAT are now not copy safe, renamed them to acTL, fcTL and adAT
</li></ul>
<h4 name="From_0.9"> From 0.9 </h4>
<ul><li> Split <code>render_op</code> into <code>dispose_op</code> and <code>blend_op</code>
</li></ul>
<h4 name="From_0.10"> From 0.10 </h4>
<ul><li> No changes
</li></ul>
<h3 name="Test_Encoder_and_Sample_Images">Test Encoder and Sample Images</h3>
<p>Sample images are available from the APNG implementation page at http://littlesvr.ca/apng/
</p><p>An encoder (open source) is available in versions of the Gecko engine starting with version 1.9 alpha 4.
</p><p>An application (open source) using the Mozilla encoder to assemble APNGs available here: http://littlesvr.ca/apng/apngedit.html
</p>
<h3 name="See_also">See also</h3>
<ul><li><a class="external" href="http://www.w3.org/TR/PNG/">Portable Network Graphics (PNG) Specification (Second Edition)</a>
</li><li><a class="external" href="http://pmt.sourceforge.net/specs/png-1.2-pdg.html">Extensions to the PNG Specification, Version 1.2.0</a>
</li><li><a class="external" href="http://www.w3.org/Graphics/GIF/spec-gif89a.txt">Graphics Interchange Format 89a</a>
</li></ul>
<p><br>
</p>
<div class="noinclude">
</div>
{{ wiki.languages( { "es": "es/Gr\u00e1ficos_PNG_animados", "fr": "fr/Images_PNG_anim\u00e9es" } ) }}
Revert to this revision