How to identify CMYK images in ASP.NET using C#

后端 未结 6 1536
我寻月下人不归
我寻月下人不归 2021-02-02 14:54

Does anybody know how to properly identify CMYK images in ASP.NET using C#? When I check the Flags attribute of a Bitmap instance, I get incorrect resu

6条回答
  •  没有蜡笔的小新
    2021-02-02 15:26

    So here is how I solved the issue you were having which was the same as what I was having. Everything in csharp looks to return rgb info when you know it's a 100% a cymk image. So what to do, well go to the root and read the file. Here is what I had done and tested to work well and should cover all OS's, and 50 for 50 imgs tested right. This is 2.0 too just in case.

         public bool isByteACMYK(Stream image)
        {
            using (StreamReader sr = new StreamReader(image)) 
            { 
                string contents = sr.ReadToEnd(); 
                if (contents.ToLower().Contains("cmyk")) 
                { 
                    return true;
                } 
            }
            return false;
        }
    
        public bool isFileACMYKJpeg(System.Drawing.Image image)
        {
            System.Drawing.Imaging.ImageFlags flagValues = (System.Drawing.Imaging.ImageFlags)Enum.Parse(typeof(System.Drawing.Imaging.ImageFlags), image.Flags.ToString());
            if (flagValues.ToString().ToLower().IndexOf("ycck") == -1)
            {
                // based on http://www.maxostudio.com/Tut_CS_CMYK.cfm
    
                bool ret = false;
                try{
                    int cmyk = (image.Flags & (int)ImageFlags.ColorSpaceCmyk);
                    int ycck = (image.Flags & (int)ImageFlags.ColorSpaceYcck);
    
                    ret = ((cmyk > 0) || (ycck > 0));
                } catch (Exception ex){
    
                }
                return ret;
            }
            return true;
        } 
        // my upload test .. but you could turn a file to stream and do the same
        public void UpdatePool(HttpPostedFile newimage)
        {
            if (newimage.ContentLength != 0)
            {
                Stream stream = newimage.InputStream;
                MemoryStream memoryStream = new MemoryStream();
                CopyStream(stream,memoryStream);
                memoryStream.Position = 0;
                stream = memoryStream;
    
    
                System.Drawing.Image processed_image = null;
    
                processed_image = System.Drawing.Image.FromStream(newimage.InputStream);
    
                if (imageService.isFileACMYKJpeg(processed_image) || imageService.isByteACMYK(stream))
                {
                    Flash["error"] = "You have uploaded a CMYK image.  Please conver to RGB first.";
                    RedirectToReferrer();
                    return;
                }
            }
        }
    

    cheers - Jeremy

提交回复
热议问题