サムネイルを作成し、バイト配列に変換します
-
23-08-2019 - |
質問
私は、サムネイルを作成し、バイト配列に変換して、時間の一体を抱えています。私は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);
}