문제

나는 썸네일을 만들고 바이트 어레이로 변환하는 데 시간이 걸렸습니다. 세 가지 방법을 시도했는데 3 번 모두 오류가 발생합니다.

첫 번째는 BitMap.getThumbnailimage를 사용하는 것이 었습니다. 과거에 사용한 다음 직접 응답으로 저장했습니다.

두 번째는 drawImage ()와 함께 System.Drawing.Graphics를 사용하는 것이 었습니다. 아직 갈 수 없습니다.

세 번째는 새로운 비트 맵을 만들고 이전 비트 맵을 통과하고 새 크기를 설정하는 것이 었습니다. 동일한 오류.

가치는 무일하게 될 수 없습니다.
매개 변수 이름 : 인코더

설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 내용은 스택 추적을 검토하십시오.

예외 세부 사항 : System.ArgumentNullexection : 값은 무효 일 수 없습니다.
매개 변수 이름 : 인코더

소스 오류 :
현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 예외의 원점 및 위치에 관한 정보는 아래의 예외 스택 추적을 사용하여 식별 할 수 있습니다.

스택 추적 :
ArgumentNullexception : 값은 무효 일 수 없습니다.
매개 변수 이름 : 인코더
System.Drawing.Image.save (스트림 스트림, imagecodecinfo 인코더, 인코더 파라미터 인코딩 파람) +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, 저장 (스트림, 형식)은 저장 (스트림, 인코더, 매개 변수)을 호출하고 인코더는 형식에서 가져옵니다. 귀하의 경우 이미지의 원래 형식입니다.

커뮤니티 콘텐츠에 따르면 메소드를 저장하십시오, 일부 형식은 적절한 인코더로 잘 변환되지 않습니다.

PNG와 같은 표준 형식을 사용하여 인코더를 직접 지정하는 것이 좋습니다.

노력하다:

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

다른 팁

원래 형식으로 저장하려면 원래 이미지 형식이 지원되는 경우에 작동하기 때문에 다음을 시도 할 수 있습니다.

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top