Soru C # içinde Bitmap nesnesini kullanarak görüntü formatı bulun


Görüntü dosyası sabit sürücüsünün ikili baytını yükleyip bir Bitmap nesnesine yüklüyorum. Bitmap nesnesinden görüntü türünü [JPEG, PNG, BMP vb.] Nasıl bulabilirim?

Önemsiz görünüyor. Ama anlayamadım!

Alternatif bir yaklaşım var mı?

Cevabınızı takdir edin.

GÜNCEL DOĞRU ÇÖZÜM: 

@CMS: Doğru yanıt için teşekkürler!

Bunu elde etmek için örnek kod.

using (MemoryStream imageMemStream = new MemoryStream(fileData))
{
    using (Bitmap bitmap = new Bitmap(imageMemStream))
    {
        ImageFormat imageFormat = bitmap.RawFormat;
        if (bitmap.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
            //It's a JPEG;
        else if (bitmap.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
            //It's a PNG;
    }
}

76
2017-09-09 04:24


Menşei


Ekleyebilirsiniz System.Drawing.Imaging biçimini kullanma yönergeleriniz, biçimin daha az ayrıntılı olmasını sağlamak için ... - CMS
@ CMS: Anlaştık! Ek bilgi için tam ad alanını görüntülemek istedim. - pencilslate
Hmmm ... Aynı tekniği denedim ama işe yaramıyor. Yüklü bir PNG'im var ve RawFormat değerini tüm ImageFormat değerleriyle karşılaştırdığımda, bunların hiçbiri eşleşmiyor. Gerçek RawFormat değeri {b96b3caf-0728-11d3-9d7b-0000f81ef32e} şeklindedir. - Igor Brejc


Cevaplar:


Bir resmin biçimini bilmek istiyorsanız, dosyayı görüntü sınıf ve kontrol et RawFormat özelliği:

using(Image img = Image.FromFile(@"C:\path\to\img.jpg"))
{
    if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
    {
      // ...
    }
}

97
2017-09-09 04:36



Not: Görünüşe göre img.RawFormat == ImageFormat.Jpeg çalışmıyor. Sen var kullanmak img.RawFormat.Equals(ImageFormat.Jpeg). - BlueRaja - Danny Pflughoeft
@BlueRaja, Evet, neden böyle? Çoğu .NET sınıfı, Equals () yöntemini ve operatörünü geçersiz kılmaz mı? Ya da, belki yanlış bir şekilde yanlış ifade ediyorum - .NET, == işlecini kullanırken varsayılan olarak .Equals () yöntemini kullanmıyor mu? Yanlış mıyım? - Pandincus
Gah! Yok hayır merak etmek Bu çalışma değildi. Sanırım hile yaptım. Lanet olsun! Teşekkürler çocuklar, şimdi bana bir sürü zaman kazandı. - Ubiquitous Che
@Pandincus: hayır, üzgünüm. - BlueRaja - Danny Pflughoeft
Geçersiz kılınmadığı veya birkaç yerleşik türden biri olmadığı sürece, == referans eşitliğini kullanır, değil Equals. Kullanım yanında Equals kendiniz, statik kullanabilirsiniz object.Equals(obj1, obj2) (hangi Equals) Basit sıfır emniyet için. - Tim S.


İşte benim uzantısı yöntemim. Umarım bu birisine yardım eder.

public static System.Drawing.Imaging.ImageFormat GetImageFormat(this System.Drawing.Image img)
    {             
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
            return System.Drawing.Imaging.ImageFormat.Jpeg;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Bmp))
            return System.Drawing.Imaging.ImageFormat.Bmp;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
            return System.Drawing.Imaging.ImageFormat.Png;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Emf))
            return System.Drawing.Imaging.ImageFormat.Emf;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Exif))
            return System.Drawing.Imaging.ImageFormat.Exif;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Gif))
            return System.Drawing.Imaging.ImageFormat.Gif;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Icon))
            return System.Drawing.Imaging.ImageFormat.Icon;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.MemoryBmp))
            return System.Drawing.Imaging.ImageFormat.MemoryBmp;
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Tiff))
            return System.Drawing.Imaging.ImageFormat.Tiff;
        else
            return System.Drawing.Imaging.ImageFormat.Wmf;            
    }

44
2018-01-31 14:45



.NET framework'ün bu işi yapmadığına ve bunun tek yol olduğuna inanamıyorum. Ben aslında şoktayım. - simonlchilds


İşte bunun için benim kodum. Tam resmi veya üstbilgiyi (ilk 4 bayt) önce bir bayt dizisine yüklemeniz gerekir.

public enum ImageFormat
{
    Bmp,
    Jpeg,
    Gif,
    Tiff,
    Png,
    Unknown
}

public static ImageFormat GetImageFormat(byte[] bytes)
{
    // 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

    if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
        return ImageFormat.Bmp;

    if (gif.SequenceEqual(bytes.Take(gif.Length)))
        return ImageFormat.Gif;

    if (png.SequenceEqual(bytes.Take(png.Length)))
        return ImageFormat.Png;

    if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
        return ImageFormat.Tiff;

    if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
        return ImageFormat.Tiff;

    if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
        return ImageFormat.Jpeg;

    if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
        return ImageFormat.Jpeg;

    return ImageFormat.Unknown;
}

11
2018-02-25 17:04



JPEG’in {255, 216, 255} için kontrol edilmesi gerekiyor. İşte bilgi en.wikipedia.org/wiki/JPEG - Mirodil


tabi ki yapabilirsin. ImageFormat fazla bir şey ifade etmiyor. ImageCodecInfo daha çok anlamı var.

red_dot.png

red_dot.png

<a href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="red_dot.png" title="red_dot.png"/>
</a>

kod:

using System.Linq;

//...

//get image
var file_bytes = System.Convert.FromBase64String(@"iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==");
var file_stream = new System.IO.MemoryStream(file_bytes);
var file_image = System.Drawing.Image.FromStream(file_stream);

//list image formats
var image_formats = typeof(System.Drawing.Imaging.ImageFormat).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static).ToList().ConvertAll(property => property.GetValue(null, null));
System.Diagnostics.Debug.WriteLine(image_formats.Count, "image_formats");
foreach(var image_format in image_formats) {
    System.Diagnostics.Debug.WriteLine(image_format, "image_formats");
}

//get image format
var file_image_format = typeof(System.Drawing.Imaging.ImageFormat).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static).ToList().ConvertAll(property => property.GetValue(null, null)).Single(image_format => image_format.Equals(file_image.RawFormat));
System.Diagnostics.Debug.WriteLine(file_image_format, "file_image_format");

//list image codecs
var image_codecs = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().ToList();
System.Diagnostics.Debug.WriteLine(image_codecs.Count, "image_codecs");
foreach(var image_codec in image_codecs) {
    System.Diagnostics.Debug.WriteLine(image_codec.CodecName + ", mime: " + image_codec.MimeType + ", extension: " + @image_codec.FilenameExtension, "image_codecs");
}

//get image codec
var file_image_format_codec = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().ToList().Single(image_codec => image_codec.FormatID == file_image.RawFormat.Guid);
System.Diagnostics.Debug.WriteLine(file_image_format_codec.CodecName + ", mime: " + file_image_format_codec.MimeType + ", extension: " + file_image_format_codec.FilenameExtension, "image_codecs", "file_image_format_type");

hata ayıklama çıkışı:

image_formats: 10
image_formats: MemoryBMP
image_formats: Bmp
image_formats: Emf
image_formats: Wmf
image_formats: Gif
image_formats: Jpeg
image_formats: Png
image_formats: Tiff
image_formats: Exif
image_formats: Icon
file_image_format: Png
image_codecs: 8
image_codecs: Built-in BMP Codec, mime: image/bmp, extension: *.BMP;*.DIB;*.RLE
image_codecs: Built-in JPEG Codec, mime: image/jpeg, extension: *.JPG;*.JPEG;*.JPE;*.JFIF
image_codecs: Built-in GIF Codec, mime: image/gif, extension: *.GIF
image_codecs: Built-in EMF Codec, mime: image/x-emf, extension: *.EMF
image_codecs: Built-in WMF Codec, mime: image/x-wmf, extension: *.WMF
image_codecs: Built-in TIFF Codec, mime: image/tiff, extension: *.TIF;*.TIFF
image_codecs: Built-in PNG Codec, mime: image/png, extension: *.PNG
image_codecs: Built-in ICO Codec, mime: image/x-icon, extension: *.ICO
Built-in PNG Codec, mime: image/png, extension: *.PNG

5
2017-10-26 16:50



İyi Alex bul! Bu karışık görünüyor olsa da, temelleri aşağıda bir çift temiz uzatma yöntemine dönüştü. - Nicholas Petersen


Basitçe konuşamazsın. Bunun nedeni, Bitmap'in JPEG, PNG vb. Gibi bir görüntü türüdür. Bir görüntüyü bir Bitmap'e yükledikten sonra bitmap formatının görüntüsü. Bir bitmap'e bakmanın ve görüntünün orijinal kodlamasını (Bitmap'ten farklı olsa bile) anlamanın bir yolu yoktur.


2
2017-09-09 04:26



Sanırım bu durumda Bitmap (kafa karıştırıcı) C # içindeki bir sınıfın adıdır. Bitmap sınıfı, muhtemelen jpg, giff, bmp vb. Olabilecek bir görüntüyü korur. Başka bir durumda evet kesinlikle doğrudur. - DarcyThomas


Alex'in yukarıdaki çalışmasına dayanarak (aslında bir çözüm olarak oy veriyorum, çünkü bir satır - ama oylama yapamıyorum haha), bir görüntü kütüphanesi için aşağıdaki işlevi buldum. 4.0 gerektirir

  Public Enum Formats
    Unknown
    Bmp
    Emf
    Wmf
    Gif
    Jpeg
    Png
    Tiff
    Icon
  End Enum

  Public Shared Function ImageFormat(ByVal Image As System.Drawing.Image) As Formats
    If Not System.Enum.TryParse(Of Formats)(System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().ToList().[Single](Function(ImageCodecInfo) ImageCodecInfo.FormatID = Image.RawFormat.Guid).FormatDescription, True, ImageFormat) Then
      Return Formats.Unknown
    End If
  End Function

1
2018-02-17 14:36





Eski konuyla uğraşmamak için değil, bu tartışmayı tamamlamak için, sorgulama yolumu paylaşmak istiyorum herşey Windows tarafından bilinen görüntü formatları.

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

public static class ImageExtentions
{
    public static ImageCodecInfo GetCodecInfo(this System.Drawing.Image img)
    {
        ImageCodecInfo[] decoders = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo decoder in decoders)
            if (img.RawFormat.Guid == decoder.FormatID)
                return decoder;
        return null;
    }
}

Şimdi, aşağıda gösterildiği gibi bir görüntü uzantısı olarak kullanabilirsiniz:

public void Test(Image img)
{
    ImageCodecInfo info = img.GetCodecInfo();
    if (info == null)
        Trace.TraceError("Image format is unkown");
    else
        Trace.TraceInformation("Image format is " + info.FormatDescription);
}

1
2017-10-29 15:20