質問

私は、サムネイルを作成し、バイト配列に変換して、時間の一体を抱えています。私は3つのメソッドを試してみた、そしてすべての3回は、私はエラーを取得します。

私は過去に使用し、その後Response.OutputStreamに直接保存したBitmap.GetThumbnailImageを、使用していた最初の

秒のdrawImageとSystem.Drawing.Graphicsを使用していました()。まだ行くます。

第三は、新しいビットマップを作成し、古いビットマップを渡して、新しいサイズを設定することだけでした。同じエラーます。

  

の値はnullにすることはできません。
  パラメータ名:エンコーダ

  説明:現在のWeb要求の実行中に発生した未処理の例外。エラー、どこで、コードの発生元の詳細については、スタックトレースを確認してください。

  例外の詳細:System.ArgumentNullException:値をnullにすることはできません
。   パラメータ名:エンコーダ

  ソースエラー:
  未処理の例外は、現在のWeb要求の実行中に生成されました。起源と例外の場所に関する情報は、以下の例外スタックトレースを使用して識別することができます。

  スタックトレース:
  [例外ArgumentNullException:値をnullにすることはできません
。   パラメータ名:エンコーダ]
     System.Drawing.Image.Save(ストリームstream、ImageCodecInfoエンコーダ、EncoderParameters encoderParams)615244

ここに私のメソッドのコードです。たぶん誰かが私が間違ってやって表示されます。場合にはあなたがGetThumbSizeがわからない、それは単に画像サイズと最大親指サイズにとり、その後、縦横比を維持するために、実際のサイズを計算する方法です。

public static System.Drawing.Image.GetThumbnailImageAbort thumbnailCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);

    public static bool ThumbnailCallback()
    {
        return false;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="image"></param>
    /// <param name="size"></param>
    /// <remarks>
    /// This method will throw a AccessViolationException when the machine OS running the server code is windows 7.
    /// </remarks>
    /// <returns></returns>
    public static byte[] CreateThumbnail(byte[] imageData, Size size)
    {
        using (MemoryStream inStream = new MemoryStream())
        {
            inStream.Write(imageData, 0, imageData.Length);

            using (System.Drawing.Image image = Bitmap.FromStream(inStream))
            {
                Size thumbSize = GetThumbSize(new Size(image.Width, image.Height), size);

                //do not make image bigger
                if (thumbSize.Equals(image.Size) || (image.Width < size.Width || image.Height < size.Height))
                {
                    //if no shrinking is ocurring, return the original bytes
                    return imageData;
                }
                else
                {
                    using (System.Drawing.Image thumb = image.GetThumbnailImage(thumbSize.Width, thumbSize.Height, thumbnailCallback, IntPtr.Zero))
                    {

                        using (MemoryStream outStream = new MemoryStream())
                        {
                            thumb.Save(outStream, thumb.RawFormat);

                            return outStream.ToArray();
                        }
                    }
                }
            }
        }

    }

この行はエラーを投げてます:

thumb.Save(outStream, thumb.RawFormat);

任意のアイデア?助けてくれてありがとう!

役に立ちましたか?

解決

私はこの問題は、元の画像のエンコーディングかもしれないと思います。 IIRCは、通話中に保存(ストリーム形式)の結果は、エンコーダはフォーマットから取られると、(ストリーム、エンコーダ、paramsは)を保存します。画像の元のフォーマットがあなたのケースではこれである。

Saveメソッドのコミュニティコンテンツによると、いくつかのフォーマット適切なエンコーダにうまく変換されません。

私はあなたがPNGのようないくつかの標準フォーマットを使用して、エンコーダを自分で指定することをお勧め。

試します:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence

他のヒント

何をやろうとしているが、元の画像フォーマットがサポートさ1であるとき、私の場合はそれが動作するように、あなたは次のことを試すことができプレーンテキスト形式で保存されている場合:

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top