2013-03-19 39 views
6

Tôi có mã C# để tìm nạp hình ảnh từ các URL như http://i.imgur.com/QvkaduU.jpg nhưng làm cách nào để tìm nạp hình ảnh từ các trang web như thế này: http://imgur.com/gallery/QvkaduU?Lấy hình thu nhỏ từ trang Web

Có cách nào "dễ dàng" để thực hiện việc này hay không, tôi sẽ phải tìm nạp HTML và xây dựng trình phân tích cú pháp C# có giao diện HTML cho hình ảnh lớn hơn tất cả các hình ảnh khác?

Hãy để tôi làm rõ điều này. Nếu bạn dán http://imgur.com/gallery/QvkaduU (phiên bản HTML) vào ví dụ trường cập nhật trạng thái của Facebook, nó sẽ tìm thấy hình ảnh chính và tạo hình thu nhỏ, đây chính xác là hành vi mà tôi đang tìm kiếm. Câu hỏi đặt ra là, việc này được thực hiện như thế nào? Tôi có phải viết trình phân tích cú pháp HTML của riêng tôi hoặc có cách dễ dàng để có được điều này không?

+1

Bạn đã kiểm tra [API của họ] (http://api.imgur.com/) phải không? – Filburt

+0

không, tôi đã hy vọng cho một giải pháp chung không chỉ cho imgurl. – Banshee

+1

Tôi nghĩ rằng cạo màn hình luôn là * khu nghỉ mát cuối cùng *. Trong hầu hết các trường hợp, nó sẽ vi phạm các điều khoản sử dụng. – Filburt

Trả lời

4

Không có cách nào dễ dàng để có được hình thu nhỏ "tốt" cho URL tùy ý.

Thuật toán của Facebook để làm như vậy khá phức tạp. phát triển trang có thể để cho nó một chút bằng cách thêm thẻ meta khác nhau để các <head>, bao gồm:

<meta property="og:image" content="http://url_to_your_image_here" /> 

hoặc

<link rel="image_src" href="http://www.code-digital.co.uk/preview.jpg" /> 

(more on this)

... vì vậy nếu bạn muốn sao chép thuật toán của Facebook, bạn sẽ cần lấy nguồn trang, phân tích cú pháp nó cho bất kỳ "gợi ý" nào như trên (bạn nên kiểm tra xem tôi đã không bỏ sót bất kỳ định dạng "gợi ý nào khác") và đưa ra dự phòng thuật toán nếu trang không bao gồm một trong số đó .

Một giải pháp thực tế hơn là sử dụng URL của người khác -> hệ thống thu nhỏ.

Nếu bạn thích phiên bản Facebook, tôi nghĩ bạn sẽ có thể yêu cầu hình thu nhỏ của Facebook cho một URL cụ thể thông qua API của họ.

dịch vụ

khác trong đó cung cấp các loại điều này là:

0

Bạn có thể thử làm điều gì đó như thế này không?

public void ProcessRequest(HttpContext context) 
    { 
     { 
      // load here the image 
      .... 
      // and send it to browser 
      ctx.Response.OutputStream.Write(imageData, 0, imageData.Length); 
     } 
    } 

Bạn cũng có thể thử những gì họ đang nói ở đây. Tôi đã thử nó và nó hoạt động như một sự quyến rũ.

http://www.dotnetspider.com/resources/42565-Download-images-from-URL-using-C.aspx

+1

Điều này sẽ chỉ tải xuống đối tượng URL cung cấp cho bạn, Nếu một hình ảnh của nó chỉ có thể nó sẽ hoạt động tốt nhưng nếu một trang HTML có nhiều hình ảnh (bên cạnh hình ảnh lớn chính) thì hầu như có thể là một vấn đề. – Banshee

0

bạn có thể thử này

public Bitmap getImageFromURL(String sURL) 
{ 
    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(sURL); 
    myRequest.Method = "GET"; 
    HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); 
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream()); 
    myResponse.Close(); 

    return bmp; 
} 

nhận từ How to get an image to a pictureBox from an URL? (Windows Mobile)

+1

Mã này sẽ chỉ tải xuống đối tượng mà url cung cấp cho bạn, nếu hình ảnh của nó sẽ hoạt động nhưng nếu trang HTML của nó sẽ không hoạt động. Vấn đề của tôi là vấn đề cuối cùng (trang HTML chứa hình ảnh). – Banshee

1

Nếu phần QvkaduU luôn giống nhau giữa các trang html và hình ảnh, có thể bạn chỉ cần làm một chuỗi thay thế?

"http://imgur.com/gallery/QvkaduU" .Replace ("imgur.com/gallery", "i.imgur.com") + ".jpg";

1

tôi sẽ lấy toàn bộ nguồn HTML và đặt tất cả các tham số <img ... src="..."> cũng như < ... style="... background-image: ...;"> thuộc tính nội tuyến css bằng cách sử dụng regex d cố gắng tải xuống tất cả các tệp đằng sau các liên kết tạm thời. Sau đó, tôi sẽ (cố gắng chuyển đổi nó sang Bitmap và) kiểm tra kích thước pixel, hình ảnh lớn nhất nên là hình ảnh bạn muốn.

Google có thể giúp bạn cách kiểm tra kích thước pixel và chuyển đổi bất kỳ hình ảnh nào.

Các regex để có được tất cả các liên kết hình ảnh từ một nguồn HTML nên

<img[^>]+src=\"([^"]+)\".*?>|<[^>]+style=\"[^"]*background-image:\s*url\(\s*'?([^')])\s*'?)\s*;.*?> (không dự thi, nhưng khá chắc chắn)

Kết quả sẽ có trong 2 hoặc chỉ số nhóm thứ 3, cũng không quên tiền tố url hiện tại trên các liên kết tương đối.

1

Bạn đã đi đúng hướng, có cách đáng tin cậy nhất là tìm nạp HTML, phân tích cú pháp và tìm kiếm hình ảnh, sau đó bạn sẽ xếp hạng hình ảnh dựa trên vị trí và kích thước. Ví dụ: nếu hình ảnh đầu tiên bạn tìm thấy đủ lớn để tạo hình thu nhỏ, sau đó làm mát, nếu nó nhỏ, bạn hãy chuyển đến hình ảnh tiếp theo, v.v. Tốt nhất nên sử dụng plugin hình ảnh như Timthumb (tôi nghĩ Tôi đã nhìn thấy một phiên bản ASP.NET đôi khi) và bộ nhớ cache các hình ảnh như vậy mà một khi bạn đã nhìn lên hình thu nhỏ để đại diện cho một trang web, bạn có thể gọi hình ảnh (s) từ bắt thay thế.

Các vấn đề liên quan