문제

나는 다운로드에서 일부 이미지를 서비스하지 않는 항상 포함하는 콘텐츠 유형을 제공하지 않는 확장자를 위한 파일이 나는 다운로드(우,묻지 않음).

최선의 방법은 무엇일을 결정하는 이미지 형식이다.NET?

응용 프로그램을 읽고 있는 이 다운로드 이미지를 요구하는 적절한 파일의 확장자는 모든 지옥은 느슨한 휴식.

도움이 되었습니까?

해결책

아고 쉽게 접근 사용하는 것이 이미지입니다.FromFile()및 다음 사용하 RawFormat 제공으로 그것이 이미 알고있는 마법에 대해 비트 헤더에서 가장 일반적인 포맷처럼,이:

Image i = Image.FromFile("c:\\foo");
if (System.Drawing.Imaging.ImageFormat.Jpeg.Equals(i.RawFormat)) 
    MessageBox.Show("JPEG");
else if (System.Drawing.Imaging.ImageFormat.Gif.Equals(i.RawFormat))
    MessageBox.Show("GIF");
//Same for the rest of the formats

다른 팁

모든 이미지 형식 설정의 처음 바이트를 특정 값으:

검색에 대한"jpg 파일 형식 교체"jpg 다른 파일 형식을 필요로 식별할 수 있습니다.

으로 가스를 권장,거기에 데이터베이스의 이러한'매직 넘' 을 보여주는 파일 유형의 파일이 있습니다.당신을 감지하는 많이 다른 파일 형식의 그것의 보람을 찾고 그것을 찾기 위해 필요한 정보를 안내해드립니다.해야 하는 경우 이 커버하는 많은,많은 파일 형태를 보면,관련 파일 명령 를 구현하는 엔진을 사용하여 데이터베이스를 올바르게(그것은 아닌 사소한 다양한 파일 형식이며,거의 통계적 처리)

-Adam

당신이 사용할 수 있는 코드는 아래 참조 없이의 시스템입니다.그리고 불필요한 창조의 개체에 이미지입니다.또한 사용할 수 있는 알렉스 솔루션에도 없는 스트림을 참조 시스템.IO.

public enum ImageFormat
{
    bmp,
    jpeg,
    gif,
    tiff,
    png,
    unknown
}

public static ImageFormat GetImageFormat(Stream stream)
{
    // see http://www.mikekunz.com/image_file_header.html
    var bmp = Encoding.ASCII.GetBytes("BM");     // BMP
    var gif = Encoding.ASCII.GetBytes("GIF");    // GIF
    var png = new byte[] { 137, 80, 78, 71 };    // PNG
    var tiff = new byte[] { 73, 73, 42 };         // TIFF
    var tiff2 = new byte[] { 77, 77, 42 };         // TIFF
    var jpeg = new byte[] { 255, 216, 255, 224 }; // jpeg
    var jpeg2 = new byte[] { 255, 216, 255, 225 }; // jpeg canon

    var buffer = new byte[4];
    stream.Read(buffer, 0, buffer.Length);

    if (bmp.SequenceEqual(buffer.Take(bmp.Length)))
        return ImageFormat.bmp;

    if (gif.SequenceEqual(buffer.Take(gif.Length)))
        return ImageFormat.gif;

    if (png.SequenceEqual(buffer.Take(png.Length)))
        return ImageFormat.png;

    if (tiff.SequenceEqual(buffer.Take(tiff.Length)))
        return ImageFormat.tiff;

    if (tiff2.SequenceEqual(buffer.Take(tiff2.Length)))
        return ImageFormat.tiff;

    if (jpeg.SequenceEqual(buffer.Take(jpeg.Length)))
        return ImageFormat.jpeg;

    if (jpeg2.SequenceEqual(buffer.Take(jpeg2.Length)))
        return ImageFormat.jpeg;

    return ImageFormat.unknown;
}

아담이 가리키는 정확하게 오른쪽 방향입니다.

는 경우에 당신을 찾고 싶어하는 방법 감 거의 모든 파일, 데이터베이스 뒤에 file 명령 UNIX,Linux,Mac OS X 기계입니다.

file 의 데이터베이스를 사용하여"매직 넘버"—그 처음 바이트를 아담 나열됩—감 파일 유형입니다. man file 당신을 말할 것이다 어디를 찾아 데이터베이스에서의 기계,예를 들어, /usr/share/file/magic. man magic 당신을 말할 것이다 그것의 형식.

할 수 있습 쓰기에 자신의 탐지를 기반으로 코드에 당신이 무엇을 참조 데이터베이스에서,사전 포장된 라이브러리(예: python-magic다),또는—만약 당신 험—구현.순전 libmagic.내가 하나를 찾을 수 없습니다,그리고 희망의 또 다른 멤버할 수 있습니다.

는 경우에 없는 유닉스 시스템,편리한 데이터베이스 다음과 같습니다:

# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
# (Greg Roelofs, newt@uchicago.edu)
# (Albert Cahalan, acahalan@cs.uml.edu)
#
# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
#
0       string          \x89PNG         PNG image data,
>4      belong          !0x0d0a1a0a     CORRUPTED,
>4      belong          0x0d0a1a0a
>>16    belong          x               %ld x
>>20    belong          x               %ld,
>>24    byte            x               %d-bit
>>25    byte            0               grayscale,
>>25    byte            2               \b/color RGB,
>>25    byte            3               colormap,
>>25    byte            4               gray+alpha,
>>25    byte            6               \b/color RGBA,
#>>26   byte            0               deflate/32K,
>>28    byte            0               non-interlaced
>>28    byte            1               interlaced
1       string          PNG             PNG image data, CORRUPTED

# GIF
0       string          GIF8            GIF image data
>4      string          7a              \b, version 8%s,
>4      string          9a              \b, version 8%s,
>6      leshort         >0              %hd x
>8      leshort         >0              %hd
#>10    byte            &0x80           color mapped,
#>10    byte&0x07       =0x00           2 colors
#>10    byte&0x07       =0x01           4 colors
#>10    byte&0x07       =0x02           8 colors
#>10    byte&0x07       =0x03           16 colors
#>10    byte&0x07       =0x04           32 colors
#>10    byte&0x07       =0x05           64 colors
#>10    byte&0x07       =0x06           128 colors
#>10    byte&0x07       =0x07           256 colors

행운을 빕니다!

가 있는 프로그래밍 방식을 결정하는 이미지다.

가 있는 클래스 시스템입니다.Drawing.Imaging.ImageCodecInfo.

이 클래스는 속성 Mime 형식FormatID.또한 그것은 방법 GetImageEncoders 는 반환 컬렉션의 모든 이미지가합니다.그것은 쉽게 만들의 사전 mime 유형에 의해 색인 형식 id 입니다.

클래스 시스템입니다.Drawing.이미지RawFormat 의 유형 시스템입니다.Drawing.Imaging.포맷 는 시설 Guid 에 해당의 시설 FormatID 의 클래스 시스템입니다.Drawing.Imaging.ImageCodecInfo, 고,그 키를 mime 형식에서 사전입니다.

예제:

정적 방법을 만드는 사전 mime 유형

static Dictionary<Guid, string> GetImageFormatMimeTypeIndex()
{
  Dictionary<Guid, string> ret = new Dictionary<Guid, string>();

  var encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();

  foreach(var e in encoders)
  {
    ret.Add(e.FormatID, e.MimeType);
  }

  return ret;
}

를 사용:

Dictionary<Guid, string> mimeTypeIndex = GetImageFormatMimeTypeIndex();

FileStream imgStream = File.OpenRead(path);
var image = System.Drawing.Image.FromStream(imgStream);
string mimeType = mimeTypeIndex[image.RawFormat.Guid];

로드하십시오 스트림으로 시스템입니다.IO.BinaryReader.

가 필요합니다 다음을 참조하는 사양에 대한 각각의 이미지를 필요로하는 형식,그리고 부하는 헤더에서는 바이트 단위로에 대해 비교하는 사양입니다.예를 들어 여기에는 PNG 사양

추가:제 파일 구조 에 대한 PNG.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top