최근에 애니메이션 GIFs
의 프레임 (비트 맵 및 기간)을로드하는 데 대해 SO question에 응답하려고했습니다. 코드는 pastenbin에 있습니다.MonoMac System.Drawing.Image.GetPropertyItem (0x5100)
내 dev 라이브러리로 이동하기 전에이 코드에 대한 추가 시험을하는 동안, 나는 코드 줄에 문제가있는 것으로 나타났습니다 :
//Get the times stored in the gif
//PropertyTagFrameDelay ((PROPID) 0x5100) comes from gdiplusimaging.h
//More info on http://msdn.microsoft.com/en-us/library/windows/desktop/ms534416(v=vs.85).aspx
var times = img.GetPropertyItem(0x5100).Value;
이를 사용하여 Windows 닷넷에서이 작업을 실행 (example GIF) 배열의 애니메이션 크기는 애니메이션의 프레임 수와 동일하며 GIF
이며 프레임의 지속 시간으로 채워집니다. (BitConverter.ToInt32()) 5 기간에 변환이 경우의 바이트 [20]에 MonoMac
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
그러나, 예컨대 동일한 코드 행은 GIF로 변환 byte[4]
반환 한 시간 (첫 번째) :
[75,0,0,0]
나는 10 가지 GIF's
이 테스트 결과는 항상 동일합니다. MonoMac는 첫 번째 기간 나열하면서 Windows의 모든 기간이, 바이트 []에 있습니다
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
는 모노
System.Drawing.Image
source code를 찾고, 길이는
GDI 래퍼입니다이 방법으로 설정하는 것 :
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
그러나 실제로 구현과 관련하여 소스와 관련하여 문제가 발생하지 않습니다. 나는 뭔가를 놓치고 있거나 이것이 버그인가?
나는 당신이 Mono GDI Plus 구현에서 대답을 찾을 것이라고 생각합니다. 나는 그것을 살펴 봤지만 gif 코덱에 대한 전문 지식이 없어서 무슨 일이 일어나는지 해독 할 수는 없습니다. 다음은 제가 발견 한 것입니다. [Image.FromFile] (https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/Image.cs)은 [libgdiplus] (https : // github. com/mono/libgdiplus/tree/master/src). libgdiplus 안에는 이미지를로드하는 함수가 있습니다. [gifcodec.c] 파일 (https://github.com/mono/libgdiplus/blob/master/src/gifcodec.c)의'gdip_load_gif_image' 함수는 gif 이미지를로드합니다. –
'gdip_load_gif_image' 내부에서 어떤 일이 일어나는지 살펴볼 필요가 있습니다. 앞서 언급했듯이 이미지가로드/디코드되고 버그가 어디 있는지 추측 할 수 있습니다. 나는 무슨 일이 일어나고 있는지 파악할 수있는 GIF 전문 지식이 없습니다. 행운을 빕니다. –