02 Ago 2019

libpng 예제

다음은 png_set_keep_unknown_chunks() 사용의 예로, 개인 "vpAg" 청크가 나중에 사용자 청크 콜백 함수에 의해 처리됩니다: 다음으로, png_struct 및 png_info를 할당하고 초기화해야 합니다. 동적으로 연결된 libpng를 사용하여도 이러한 구조의 크기가 올바른지 확인하기 위해 구조를 초기화하고 할당하는 기능이 있습니다. 또한 라이브러리 버전, 오류 처리 함수에 대한 선택적 포인터 및 필요한 경우 오류 함수에서 사용할 데이터 구조체에 대한 포인터를 전달합니다(기본 오류 처리기를 사용할 경우 포인터와 함수는 NULL이 될 수 있음). 이전 초기화 기능에 대한 아래 Libpng 변경 섹션은 참조하세요. 구조부 할당 함수는 구조를 만들지 못하면 NULL을 조용히 반환하므로 응용 프로그램에서 이를 확인해야 합니다. 이 매크로의 독특한 점은 분할을 수행하지 않고 8비트 샘플(예: 전경 픽셀및 배경 픽셀의 빨간색 구성 요소)에서 정확한 알파 블렌딩을 수행한다는 것입니다. 이 매크로와 샘플당 16비트 형제는 여러 PC 및 워크스테이션 아키텍처에서 테스트되었으며 샘플 크기에 따라 255 또는 65,535로 나누는 표준 접근 방식보다 2~13배 빠른 것으로 나타났습니다. 물론, 하드웨어 지원 알파 합성은 항상 소프트웨어에서 하는 것보다 빠를 것입니다. 많은 3D 가속기 카드가 이 기능을 제공하며, 종종 2D 애플리케이션에서도 사용할 수 있습니다. 절대 정확도가 중요하지 않을 때 대략적인 방법(65,536개 중 256개로 나누어지는)은 절대 정확도가 중요하지 않은 또 다른 빠른 대안이지만 이러한 접근 방식은 불투명 영역과 약간 투명한 영역 사이에 가시적인 테두리를 남길 수 있습니다.

setjmp/longjmp에 대한 자세한 내용은 컴파일러에 대한 setjmp/longjmp 설명서를 참조하십시오. libpng 오류 처리에 대한 자세한 내용은 아래의 사용자 지정 Libpng 섹션에서 libpng 오류 처리에 대한 토론을 참조하십시오. 오류가 발생하고 longjmp를 setjmp로 되돌리면 png_destroy_read_struct()를 호출하여 메모리를 해제할 수 있습니다. 중간 모델에 대한 Libpng의 지원은 대부분의 인기 컴파일러에서 테스트되었습니다. MAXSEG_64K가 정의되고, USE_FAR_KEYWORD가 정의되고, FAR가 pngconf.h에서 까지 정의되는지 확인하고 모든 것을 설정해야 합니다. 라이브러리의 모든 것(zlib의 구조 제외)은 원거리 데이터를 기대하고 있습니다. 포인터의 끝에 p 또는 pp가 있는 typedefs를 사용해야 합니다(또는 최소한 포인터를 보고 주의해야 합니다). 데이터 행은 png_bytepp로 정의되며, 이는 서명되지 않은 char far * far *입니다. 위의 C 코드는 위의 웹 사이트에서 발견 된 예제로 시작되었으며 너무 잘 작동하지 않았습니다. 메시지를 인쇄할지 여부를 결정하기 위해 PNG_DEBUG와 "level"을 비교하는 경우 "message"는 인쇄할 서식이 지정된 문자열이고 p1 및 p2는 printf 스타일 서식 지정 지시문에 따라 문자열에 포함되는 매개 변수입니다. 예를 들어 다음으로 png_struct 및 png_info를 할당하고 초기화해야 합니다. 둘 다 상대적으로 클 수 있으므로 여분의 스택 공간이 없는 한 스택에 저장하지 않을 수 있습니다.