Привет всем, Итак, я сейчас пытаюсь реализовать устройство APNG Specification, но у меня возникают проблемы с рендерингом рамки. Моя функцияВыполнение функции рендеринга APNG
private void UpdateUI()
{
foreach (PictureBox pb in pics)
{
APNGBox box = (APNGBox)pb.Tag;
APNGLib.APNG png = box.png;
if (box.buffer == null)
{
box.buffer = new Bitmap((int)png.Width, (int)png.Height);
}
APNGLib.Frame f = png.GetFrame(box.frameNum);
using (Graphics g = Graphics.FromImage(box.buffer))
{
switch (f.DisposeOp)
{
case APNGLib.Frame.DisposeOperation.NONE:
break;
case APNGLib.Frame.DisposeOperation.BACKGROUND:
g.Clear(Color.Transparent);
break;
case APNGLib.Frame.DisposeOperation.PREVIOUS:
if (box.prevBuffer != null)
{
g.DrawImage(box.prevBuffer, Point.Empty);
}
else
{
g.Clear(Color.Transparent);
}
break;
default:
break;
}
Bitmap read = png.ToBitmap(box.frameNum++);
switch (f.BlendOp)
{
case APNGLib.Frame.BlendOperation.OVER:
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
break;
case APNGLib.Frame.BlendOperation.SOURCE:
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
break;
default:
break;
}
g.DrawImage(read, new Point((int)f.XOffset, (int)f.YOffset));
}
box.prevBuffer = box.buffer;
pb.Image = box.buffer;
if (box.frameNum >= box.png.FrameCount)
{
box.frameNum = 0;
box.buffer = null;
box.prevBuffer = null;
}
}
}
APNGBox
является
internal class APNGBox
{
public int frameNum = 0;
public APNGLib.APNG png;
public Bitmap buffer;
public Bitmap prevBuffer;
}
Я думаю, что это в основном правильно, как я запустить его против всех изображений в APNG Gallery. Однако некоторые из них неверно отображаются (This имеет проблемы с артефактом, а this не сохраняет красную полосу слева последовательно). Обратите внимание: у вас будет просмотр страницы в Firefox 3 или выше для просмотра анимации.
Я убежден, что проблема связана с тем, как я обрабатываю DISPOSE_OP_PREVIOUS, но я не могу понять, что я делаю неправильно. Может ли кто-нибудь предположить, что я могу потерять?
Привет, у вас есть полный рабочий исходный код для обеспечения, пожалуйста? Я хотел бы отобразить apng в моем winforms приложении. Благодарю. – Dede
Прошло некоторое время с тех пор, как я в последний раз работал над ними, но я записал некоторые демо: https://github.com/murrple-1/APNGManagement. Кроме того, я уверен, что в то время я был новичком в .net/C#, поэтому для зависимостей нет NuGet (я должен это делать когда-нибудь) –
@dede Добавил поддержку NuGet только сейчас. Приложение APNGViewer должно быть полезно для вас –