결정하는 파일 형식의 이미지
-
09-06-2019 - |
문제
나는 다운로드에서 일부 이미지를 서비스하지 않는 항상 포함하는 콘텐츠 유형을 제공하지 않는 확장자를 위한 파일이 나는 다운로드(우,묻지 않음).
최선의 방법은 무엇일을 결정하는 이미지 형식이다.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: 0xFF0xD8
- PNG: 0x89 로 0x50 0x4E0x47 0x0D0x0A0x1A0x0A
- GIF: 'G''나'F'
검색에 대한"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];