0

我已经接手了以前的开发人员在我的工作中创建的自定义论坛的工作,并且遇到了一个小错误。我们不允许在论坛中使用 GIF 动画作为头像。但是,如果有人要拍摄动画 GIF,将其重命名为 imagename.jpeg,然后上传,论坛将显示该图像为动画。

这是一个非常奇怪的错误,因为如果扩展名不是 .gif,我什至认为它不会播放动画。

所以我的问题是:有没有办法检查(在.NET 2.0 中)图像是否是动画 gif,即使扩展名不是?

巴拉

4

5 回答 5

2

您可以打开文件并分析其标题以查看它是否为 GIF。根据http://www.onicos.com/staff/iz/formats/gif.html,标题的前 3 个字节应该是“GIF”。

于 2010-04-30T16:09:40.387 回答
2

在 ASP.NET 上检测图像文件是否为动画 GIF 的最佳方法是通过 .NET API 本身。这是 VB.NET 中的示例代码:

Imports System.Drawing
Imports System.Drawing.Imaging

Public Class ImageHelper

    Shared Function IsAnimatedGif(filepath As String) As Boolean
        Return GetFrameCount(filepath) > 1
    End Function

    Shared Function GetFrameCount(filepath As String) As Integer
        Using bitmap As New Bitmap(filepath)
            Dim dimensions As New FrameDimension(bitmap.FrameDimensionsList(0))
            Return bitmap.GetFrameCount(dimensions)
        End Using
    End Function

End Class

使用 C# 的相同示例:

using System.Drawing;
using System.Drawing.Imaging;

public class ImageHelper
{
    public static bool IsAnimatedGif(string filepath)
    {
        return GetFrameCount(filepath) > 1;
    }

    public static int GetFrameCount(string filepath)
    {
        using (Bitmap bitmap = new Bitmap(filepath))
        {
            FrameDimension dimensions = new FrameDimension(bitmap.FrameDimensionsList[0]);
            return bitmap.GetFrameCount(dimensions);
        }
    }
}
于 2015-08-05T12:58:03.037 回答
1

我不确定这是否有效,但请查看最后一篇文章:

http://forums.asp.net/p/1188302/2033730.aspx

于 2010-04-30T16:09:25.033 回答
1

为方便起见,这里是转换为工作 C# 代码的 PHP 代码:

byte[] byteCode1 = { 0x00, 0x21, 0xF9, 0x04 };
byte[] byteCode2 = { 0x00, 0x2C };
String strTemp;
byte[] byteContents;
bool bIsAnimatedGif = false;
int iCount;
int iPos = 0;
int iPos1;
int iPos2;
Stream st = null;

// st is a stream previously opened on a file
byteContents = new byte[st.Length];
st.Read(byteContents, 0, (int)st.Length);
strTemp = System.Text.Encoding.ASCII.GetString(byteContents);
byteContents = null;
iCount = 0;
while (iCount < 2)
{
    iPos1 = strTemp.IndexOf(System.Text.Encoding.ASCII.GetString(byteCode1), iPos);
    if (iPos1 == -1) break;
    iPos = iPos1 + 1;
    iPos2 = strTemp.IndexOf(System.Text.Encoding.ASCII.GetString(byteCode2), iPos);
    if (iPos2 == -1) break;
    if ((iPos1 + 8) == iPos2)
        iCount++;
    iPos = iPos2 + 1;
}
if (iCount > 1) bIsAnimatedGif = true;
于 2015-03-27T23:45:22.190 回答
0

这是一个 PHP 片段(从 PHP 论坛中摘取),它完全符合您的要求。将其转换为 .NET 应该非常简单。

function is_animated_gif($filename)
{
    $filecontents=file_get_contents($filename);

    $str_loc=0;
    $count=0;
    while ($count < 2) 
    {
            $where1=strpos($filecontents,"\x00\x21\xF9\x04",$str_loc);
            if ($where1 === FALSE)
            {
                    break;
            }
            else
            {
                    $str_loc=$where1+1;
                    $where2=strpos($filecontents,"\x00\x2C",$str_loc);
                    if ($where2 === FALSE)
                    {
                            break;
                    }
                    else
                    {
                            if ($where1+8 == $where2)
                            {
                                    $count++;
                            }
                            $str_loc=$where2+1;
                    }
            }
    }

    if ($count > 1)
    {
            return(true);
    }
    else
    {
            return(false);
    }
}
于 2010-04-30T16:12:03.190 回答