सवाल सी # में बिटमैप ऑब्जेक्ट का उपयोग करके छवि प्रारूप ढूंढें


मैं छवि फ़ाइल हार्ड ड्राइव के बाइनरी बाइट्स लोड कर रहा हूं और इसे बिटमैप ऑब्जेक्ट में लोड कर रहा हूं। बिटमैप ऑब्जेक्ट से मैं छवि प्रकार [जेपीईजी, पीएनजी, बीएमपी आदि] कैसे ढूंढूं?

तुच्छ लग रहा है। लेकिन, इसे समझ नहीं सका!

क्या कोई वैकल्पिक दृष्टिकोण है?

अपनी प्रतिक्रिया की सराहना करें।

अद्यतन सही समाधान: 

@ सीएमएस: सही प्रतिक्रिया के लिए धन्यवाद!

इसे प्राप्त करने के लिए नमूना कोड।

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


मूल


आप जोड़ सकते हैं System.Drawing.Imaging प्रारूप को कम वर्बोज़ जांचने के लिए, आपके उपयोग निर्देशों के लिए नामस्थान ... - CMS
@ सीएमएस: सहमत! अतिरिक्त जानकारी के लिए पूरा नामस्थान प्रदर्शित करना चाहता था। - pencilslate
हमम ... मैंने एक ही तकनीक की कोशिश की, लेकिन यह काम नहीं करता है। मेरे पास एक पीएनजी लोड है और जब मैं अपने RawFormat मूल्य की तुलना सभी छविफॉर्मेट से करता हूं। * उदाहरण, उनमें से कोई भी मेल नहीं खाता है। वास्तविक RawFormat मान {b96b3caf-0728-11d3-9d7b-0000f81ef32e} है। - Igor Brejc


जवाब:


अगर आप किसी छवि के प्रारूप को जानना चाहते हैं, तो आप फ़ाइल को लोड कर सकते हैं छवि कक्षा, और इसकी जांच करें RawFormat संपत्ति:

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



नोट: ऐसा प्रतीत होता है img.RawFormat == ImageFormat.Jpeg काम नहीं करता। आप है उपयोग करने के लिए img.RawFormat.Equals(ImageFormat.Jpeg)। - BlueRaja - Danny Pflughoeft
@ ब्लूराजा, हाँ, वह क्यों है? अधिकांश .NET कक्षाएं बराबर () विधि और ऑपरेटर दोनों को ओवरराइड नहीं करते हैं? या, हो सकता है कि मैं इसे गलत वाक्यांश दे रहा हूं - .NET का उपयोग करते समय .NET डिफ़ॉल्ट रूप से .quals () विधि का उपयोग नहीं करता है? क्या मैं गलत हूँ? - Pandincus
गाह! नहीं आश्चर्य वह काम नहीं कर रहा था। मैंने माना == चाल है। अरे नहीं! धन्यवाद दोस्तों, मुझे अभी समय का एक गुच्छा बचाया। - Ubiquitous Che
@ पांडिन्सस: कोई सुराग, क्षमा करें। - BlueRaja - Danny Pflughoeft
जब तक यह ओवरराइड नहीं होता है या कुछ अंतर्निर्मित प्रकारों में से एक है, == संदर्भ समानता का उपयोग करता है, नहीं Equals। उपयोग करने के अलावा Equals स्वयं, आप स्थिर का उपयोग कर सकते हैं object.Equals(obj1, obj2) (जो कॉल करता है Equals) सरल शून्य सुरक्षा के लिए। - Tim S.


मेरी विस्तार विधि यहां दी गई है। उम्मीद है कि यह किसी की मदद करेगा।

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 ढांचे में यह बेक्ड नहीं है और यह एकमात्र तरीका है। मैं वास्तव में सदमे में हूँ। - simonlchilds


इसके लिए मेरा कोड यहाँ है। आपको पहले एक बाइट सरणी में पूरी छवि या शीर्षलेख (पहले 4 बाइट्स) लोड करना होगा।

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



{255, 216, 255} के लिए जेपीईजी की जांच की जानी चाहिए। यहां जानकारी है en.wikipedia.org/wiki/JPEG - Mirodil


बेशक आप कर सकते हैं। ImageFormat ज्यादा मतलब नहीं है। ImageCodecInfo बहुत अधिक अर्थ है।

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>

कोड:

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");

डीबग आउटपुट:

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



अच्छा लगता है एलेक्स! हालांकि यह गन्दा दिखता है, लेकिन मूल बातें नीचे दी गई कुछ साफ एक्सटेंशन विधियों में बदल गई हैं। - Nicholas Petersen


बस बोलते हुए आप नहीं कर सकते। इसका कारण यह है कि बिटमैप एक प्रकार की छवि है जिस तरह से जेपीईजी, पीएनजी, आदि हैं। एक बार जब आप बिटमैप प्रारूप में छवि को बिटमैप प्रारूप में लोड करते हैं। बिटमैप को देखने और छवि के मूल एन्कोडिंग को समझने का कोई तरीका नहीं है (यदि यह बिटमैप से भी अलग है)।


2
2017-09-09 04:26



मुझे लगता है कि इस मामले में बिटमैप (भ्रमित) सी # में एक वर्ग का नाम है। बिटमैप कक्षा में एक छवि होती है, जो संभावित रूप से जेपीजी, गीफ, बीएमपी आदि कर सकती है। किसी भी अन्य परिस्थिति में हाँ आप बिल्कुल सही हैं। - DarcyThomas


उपरोक्त एलेक्स के काम के आधार पर (जिसे मैं वास्तव में समाधान के रूप में वोट देता हूं, क्योंकि यह एक पंक्ति है - लेकिन मैं अभी तक हाहा नहीं दे सकता), मैं एक छवि पुस्तकालय के लिए निम्नलिखित फ़ंक्शन के साथ आया था। इसे 4.0 की आवश्यकता है

  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





पुराने विषय पर परेशान न करें, लेकिन इस चर्चा को पूरा करने के लिए, मैं क्वेरी के लिए अपना रास्ता साझा करना चाहता हूं सब खिड़कियों द्वारा ज्ञात छवि प्रारूप।

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;
    }
}

अब आप नीचे दिखाए गए अनुसार एक छवि एक्सटेंशन के रूप में इसका उपयोग कर सकते हैं:

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