ASP.NET: как проверить, является ли изображение GIF, особенно изображения с измененными расширениями - PullRequest
0 голосов
/ 30 апреля 2010

Я взял на себя работу для пользовательских форумов, которые предыдущий разработчик создал на моей работе, и натолкнулся на небольшую ошибку. Мы не допускаем анимированные GIF-файлы в качестве аватаров на форумах. Однако, если кто-то возьмет анимированный GIF, переименует его в imagename.jpeg, а затем загрузит, форумы покажут изображение как анимированное.

Это очень странная ошибка, так как я даже не думал, что она воспроизводит анимацию, если расширение не было .gif.

Итак, мой вопрос: есть ли способ проверить (в .NET 2.0), является ли изображение анимированным GIF, даже если расширение не является?

Бар

Ответы [ 5 ]

2 голосов
/ 05 августа 2015

Лучший способ определить, является ли файл изображения анимированным GIF-файлом в ASP.NET, - это сам .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);
        }
    }
}
2 голосов
/ 30 апреля 2010

Вы можете открыть файл и проанализировать его заголовок, чтобы увидеть, является ли он GIF. Согласно http://www.onicos.com/staff/iz/formats/gif.html, первые 3 байта заголовка должны быть «GIF».

1 голос
/ 30 апреля 2010

Я не уверен, что это работает, но проверьте последний пост:

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

0 голосов
/ 28 марта 2015

Для удобства вот код PHP, преобразованный в рабочий код C #:

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;
0 голосов
/ 30 апреля 2010

Вот фрагмент 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...