8

ユーザーがアップロードする画像をスケーリングするコードがいくつかあります。ほとんどの状況で完全に機能しますが、cmyk 情報を含む jpeg をアップロードすることがあります。

少しグーグルで調べたところ、cmyk 値を含む jpeg は有効ではないように見えますが、それらは Windows で動作するため、ユーザーはそれが私のアプリケーションの問題であると想定しているため、そのような状況を処理できるようにする必要があります。質問:

jpeg に cmyk 情報が含まれているかどうかを検出するにはどうすればよいですか? (それが機能しない理由をユーザーに知らせることができます)。

どうすれば通常の jpeg に変換できますか?

4

2 に答える 2

3

ASP.NET では、CMYK プロファイルを使用して System.Drawing.Imaging.ImageFlags 列挙体を使用して JPG が保存されているかどうかを判断できます。

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageflags(VS.80).aspx

ユーザーがファイルをアップロードする基本的な aspx ページがあり、次のように伝える必要があるとします。

1) jpgですか?2)RGBを使用していますか?

あなたのaspxは、

<form id="form1" runat="server" enctype="multipart/form-data">
<asp:FileUpload ID="myUpload" runat="server" />
<asp:Button ID="submitButton" runat="server" Text="Submit" OnClick="Click_submitButton" />      
<br /><br />     
<asp:Literal ID="feedback" runat="server" />
</form>

コード ビハインド (C#) では、次のことができます。

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Click_submitButton(object sender, EventArgs e)
    {
        if (myUpload.HasFile && isUploadAJpeg(myUpload.PostedFile))
        {
            System.Drawing.Bitmap uploadedImage = new System.Drawing.Bitmap(myUpload.PostedFile.InputStream);
            if (isFileACMYKJpeg(uploadedImage))
            {
                feedback.Text = "The file is a CYMK jpg";
            }
            else
            {
                feedback.Text = "This is a RGB jpg";
                //it is a rgb jpg --> do something with it
            }
        }
        else
        {
            feedback.Text = "You did not upload a jpg";
        }
    }

    protected bool isUploadAJpeg(HttpPostedFile someFile)
    {
        if (someFile.ContentType == "image/jpg" || someFile.ContentType == "image/jpeg" || someFile.ContentType == "image/pjpeg")
        {
            return true;
        }
        return false;
    }

    protected bool isFileACMYKJpeg(System.Drawing.Image someImage)
    {
        System.Drawing.Imaging.ImageFlags flagValues = (System.Drawing.Imaging.ImageFlags)Enum.Parse(typeof(System.Drawing.Imaging.ImageFlags), someImage.Flags.ToString());
        if (flagValues.ToString().ToLower().IndexOf("ycck") == -1)
        {
            return false;
        }
        return true;
    }
}

それが役立つことを願っています!

于 2009-08-06T16:28:53.307 に答える
3

JPEG は、ビットストリーム内で任意の数のエンコードされたプレーン (互いに独立して圧縮される) をサポートする標準であるため、cmyk プロファイルを持つ JPEG は完全に有効です。ほとんどの jpeg ファイルは、もともとグレースケール画像、YCbCr、または sRGB のみをサポートしていた jfif コンテナー ( http://en.wikipedia.org/wiki/JFIF ) を使用してエンコードされていますが、拡張可能であり、Adobe には cmyk プロファイルをサポートするためのカスタム タグがあります。 .

http://www.jroller.com/greenhorn/entry/adobe_photoshop_and_jpeg_cmykの回避策については、このリンクを参照してください 。これは Java ですが、C# に簡単に移植できます。

于 2009-01-15T14:16:01.090 に答える