7

サムネイルを作成してからバイト配列に変換するのに苦労しています。3 つの方法を試しましたが、3 回ともエラーが発生しました。

1 つ目は、Bitmap.GetThumbnailImage を使用することでした。これは過去に使用したもので、Response.OutputStream に直接保存しました。

2 番目は、DrawImage() で System.Drawing.Graphics を使用していました。まだ行きません。

3 つ目は、新しいビットマップを作成し、古いビットマップを渡し、新しいサイズを設定するだけでした。同じエラー。

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

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

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

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

スタック トレース:
[ArgumentNullException: 値を null にすることはできません。
パラメータ名:エンコーダ】
System.Drawing.Image.Save(ストリームストリーム、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);

何か案は?助けてくれてありがとう!

4

2 に答える 2

6

問題は元の画像のエンコーディングにあると思います。IIRC、Save(stream、format) は、フォーマットから取得されたエンコーダーを使用して、Save(stream、encoder、params) を呼び出します。あなたの場合、これは画像の元の形式です。

Save メソッドのコミュニティ コンテンツによると、一部の形式は適切なエンコーダーにうまく変換されません。

PNG などの標準形式を使用して、エンコーダーを自分で指定することをお勧めします。

試す:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence
于 2009-05-21T17:52:26.777 に答える
1

あなたがしようとしているのがRaw形式で保存することである場合、元の画像形式がサポートされている場合に機能するように、次のことを試すことができます。

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
于 2012-01-05T21:57:40.950 に答える