2011-01-06 3 views
4

메신저 특정 URL의 웹 페이지에서 이미지를 가져 오는 중, 높이와 너비를 가져 오려고합니다. 나는 이런 식으로 뭔가를 사용하고 있습니다 :웹상에서 이미지의 크기를 얻으십시오 - 메모리 돼지를 피하십시오?

Stream str = null; 
HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(ImageUrl); 
HttpWebResponse wRes = (HttpWebResponse)(wReq).GetResponse(); 
str = wRes.GetResponseStream(); 

var imageOrig = System.Drawing.Image.FromStream(str); 
int height = imageOrig.Height; 
int width = imageOrig.Width; 

이 나의 주요 관심사는 이미지 파일이 실제로 매우 클 수 있다는 점이다

내가 할 수있는 일이 있나요? 즉, 이미지가 1MB 미만인 경우에만 이미지를 가져 오도록 지정 하시겠습니까? 또는 웹 페이지에서 이미지의 크기를 가져 오는 더 나은 대체 방법이 있습니까?

감사

답변

5

일부 (모두?) 이미지 형식에는 파일 헤더의 너비 및 높이 속성이 포함됩니다. 헤더를 읽고 자신을 파싱 할 수있을만큼 충분한 바이트를 요청할 수 있습니다. 나는이는 것이다 가정

wReq.AddRange(0, 50); 

: 당신은 첫 번째 50 바이트를 요청합니다 웹 요청에 범위 헤더를 추가 할 수있는 이미지 파일로 (50 단지 예입니다, 당신은 아마 덜 필요할 것) 작업중인 형식에이 데이터가 포함되어있는 경우 작동합니다.

편집 : 전에 AddRange 방법을 오해 한 것 같습니다. 이제 해결되었습니다. 나는 또한 앞뒤로 가서 this documentation을 사용하여 png의 너비와 높이를 얻음으로써 그것을 테스트했다.

static void Main(string[] args) 
{ 
    string imageUrl = "http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png"; 
    byte[] pngSignature = new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 }; 
    HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(imageUrl); 
    wReq.AddRange(0, 30); 
    WebResponse wRes = wReq.GetResponse(); 
    byte[] buffer = new byte[30]; 
    int width = 0; 
    int height = 0; 

    using (Stream stream = wRes.GetResponseStream()) 
    { 
     stream.Read(buffer, 0, 30); 
    } 

    // Check for Png 
    // 8 byte - Signature 
    // 4 byte - Chunk length 
    // 4 byte - Chunk type - IDHR (Image Header) 
    // 4 byte - Width 
    // 4 byte - Height 
    // Other stuff we don't care about 
    if (buffer.Take(8).SequenceEqual(pngSignature)) 
    { 
     var idhr = buffer.Skip(12); 
     width = BitConverter.ToInt32(idhr.Skip(4).Take(4).Reverse().ToArray(), 0); 
     height = BitConverter.ToInt32(idhr.Skip(8).Take(4).Reverse().ToArray(), 0); 
    } 
    // Check for Jpg 
    //else if (buffer.Take(?).SequenceEqual(jpgSignature)) 
    //{ 
    // // Do Jpg stuff 
    //} 
    // Check for Gif 
    //else if (etc... 

    Console.WriteLine("Width: " + width); 
    Console.WriteLine("Height: " + height); 
    Console.ReadKey(); 
} 
+2

jgp 및 gif 서명을 찾는 방법 ... – trocphunc

+0

[누군가 어딘가에 있습니다] (http://stackoverflow.com/questions/4620923/get-dimensions-of-an-image-on-the-web-avoid-memory -hog/4621271 # 4621271)는 jpg 및 gif를 식별하는 방법을 보여줍니다. – Chris

0
당신은 파일 크기를 찾을 너무 것처럼에서는 FileInfo 클래스를 사용하여 시도 할 수

.

long fileSizeInKb = new FileInfo(fileName).Length/1000; 
if (fileSizeInKb < 1000) 
{ 
    // get image 
} 

Length 속성은 현재 파일의 바이트 수를 반환합니다.

+0

다른 웹 사이트에서 파일을 사용할 수 없습니까? – raklos

+0

서버에 대한 올바른 사용 권한을 가질 수 있습니다. – Sheridan

1

입력 이미지 이름이 주어진 경우 응답으로 크기를 제공하는 웹 서비스를 작성할 수 있습니다.

결과 값에 따라 이미지를 다운로드하도록 선택할 수 있습니다.

웹 서비스보다 가벼운 것이 필요한 경우 HTTP 처리기로 이동하십시오.

3
에만 참조 사진 크기를 찾기 위해 그래픽 파일에서 헤더를 다운로드 할 필요가

...

BMP : (만 26 바이트 필요) http://www.fileformat.info/format/bmp/corion.htm

JPG : ("프레임의 스타"마커 검사) http://wiki.tcl.tk/757

GIF : (10 바이트, 논리 화면 기술자의 즉, 처음 두 단어를 필요) http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp

또한 첫 번째 바이트 수를 읽고 파일 유형이 실제로 무엇인지 알아낼 수 있습니다 (파일 이름의 확장명에 의존하지 마십시오). 예를 들어, bmp는 실수로 ".gif"라는 이름이 될 수 있습니다. 파일 유형을 알고 나면 어떤 오프셋을 읽어야하는지 사양을 살펴볼 수 있습니다.

P. "16 진수 편집기 XVI32"와 같은 16 진 편집기를 사용하여 파일 구조를 확인하십시오. 여기에서 XVI32를 다운로드 할 수 있습니다 : http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm

+0

이 + Rfvgyhn 대답은 당신에게 가장 작은 메모리 사용량을 줄 것입니다 ... –

관련 문제