我已经接手了以前的开发人员在我的工作中创建的自定义论坛的工作,并且遇到了一个小错误。我们不允许在论坛中使用 GIF 动画作为头像。但是,如果有人要拍摄动画 GIF,将其重命名为 imagename.jpeg,然后上传,论坛将显示该图像为动画。
这是一个非常奇怪的错误,因为如果扩展名不是 .gif,我什至认为它不会播放动画。
所以我的问题是:有没有办法检查(在.NET 2.0 中)图像是否是动画 gif,即使扩展名不是?
巴拉
我已经接手了以前的开发人员在我的工作中创建的自定义论坛的工作,并且遇到了一个小错误。我们不允许在论坛中使用 GIF 动画作为头像。但是,如果有人要拍摄动画 GIF,将其重命名为 imagename.jpeg,然后上传,论坛将显示该图像为动画。
这是一个非常奇怪的错误,因为如果扩展名不是 .gif,我什至认为它不会播放动画。
所以我的问题是:有没有办法检查(在.NET 2.0 中)图像是否是动画 gif,即使扩展名不是?
巴拉
您可以打开文件并分析其标题以查看它是否为 GIF。根据http://www.onicos.com/staff/iz/formats/gif.html,标题的前 3 个字节应该是“GIF”。
在 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);
}
}
}
我不确定这是否有效,但请查看最后一篇文章:
为方便起见,这里是转换为工作 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;
这是一个 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);
}
}