2010-08-20 32 views
6

Tôi phải thừa nhận rằng tôi không bao giờ hiểu các luồng là gì - tôi luôn nghĩ đó là một thứ internet. Nhưng bây giờ tôi chạy vào một mã mà sử dụng một dòng suối để tải một tập tin localy và tôi tự hỏi, nếu có là lợi thế cho việc sử dụng một dòng trên ... cũng cách tôi file luôn nạp:Đang tải một tập tin hình ảnh Image.FromFile VS FileStream

private void loadingfromStream() 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo("c:/"); 
    FileInfo[] fileInfoArr = dirInfo.GetFiles(); 
    FileInfo fileInfo = fileInfoArr[0];  

    // creating a bitmap from a stream 
    FileStream fileStream = fileInfo.OpenRead();    
    Bitmap bitmap = new Bitmap(fileStream); 
    Image currentPicture = (Image)bitmap  
} 

vs

private void loadingUsingImageClass 
{  
    Image currentPicture = Image.FromFile(originalPath); 
} 

Trả lời

15

Nếu bạn biết mã của bạn sẽ được tải các dữ liệu từ một tập tin, sử dụng Image.FromFile - đó là rõ ràng mã khá đơn giản, và nó chỉ có thể là có tối ưu hóa trong khuôn khổ khi nó đối phó với các tập tin.

Sử dụng luồng linh hoạt hơn, nhưng trừ khi bạn cần tính linh hoạt đó, hãy đi với giải pháp tệp.

+0

Phương pháp nào tốt hơn khi tôi cần hình ảnh của mình được truy cập từ nhiều điểm cùng một lúc ?. Giống như hiển thị hình ảnh tại 3 địa điểm cùng một lúc và chỉnh sửa quá. – iamCR

+0

@SanthoshKumar: Thật khó để trả lời rằng không có thêm thông tin, cần phải có một câu hỏi khác. Tôi mong đợi 'Image.FromFile' sẽ ổn. –

2

Là một bổ sung cho câu trả lời của Jon:

Theo tôi thấy, hai phương pháp cũng không thực hiện tương tự. Hình ảnh đầu tiên được cung cấp cho bạn hình ảnh đầu tiên trong "C:\" trong đó hình ảnh thứ hai chỉ cung cấp cho bạn hình ảnh từ một đường dẫn. Vì vậy, độ phức tạp được thêm vào đầu tiên không chỉ vì nó đang sử dụng các luồng.

này sẽ tương đương:

using (var fs = File.OpenRead(path)) 
using (var img = Image.FromStream(fs)) 
{ 
    //... 
} 

và trong trường hợp đó, nó chắc chắn là tốt hơn để chỉ làm điều đó với Image.FromFile như Jon giải thích.

3

Nếu bạn muốn xử lý các tệp hình ảnh, tất nhiên giải pháp thứ hai là tốt hơn. Trong phần đầu tiên của bạn, bạn có Bitmap bitmap = new Bitmap(fileStream); bạn biết rằng một tệp hình ảnh không phải lúc nào cũng là Bitmap, nó cũng có thể là JPEG/PNG/TIFF và vân vân. Mặc dù Image.FromFile khá chuyên nghiệp để xử lý các tệp hình ảnh có các tiện ích mở rộng khác nhau.

Nói chung, FileStream phổ biến ở các sự cố tệp, trong khi Image.FromFile cụ thể hơn ở tệp hình ảnh. Nó phụ thuộc vào loại tệp bạn sẽ xử lý.

2

Vâng, một tệp cũng thường được coi là một luồng. Đó là lý do tại sao lớp chính mở tệp được gọi là FileStream. Nhưng có một tính năng hệ điều hành cụ thể có thể xử lý các tệp hình ảnh hiệu quả hơn. Nó được gọi là 'tệp ánh xạ bộ nhớ', một tính năng ánh xạ nội dung của tệp trực tiếp vào bộ nhớ. Có một số khói và gương liên quan, nhưng về cơ bản nó làm cho các tập tin trực tiếp có sẵn mà không cần phải đọc nó. Bộ nhớ bạn cần lưu trữ dữ liệu tệp không chiếm dung lượng trong tệp hoán trang.

Rất hiệu quả, bạn sẽ nhận được nó miễn phí khi bạn sử dụng FromFile() hoặc hàm tạo bitmap (chuỗi) cho một hình ảnh ở định dạng .bmp. Tải hình ảnh từ một luồng có xu hướng yêu cầu hai lần lượng bộ nhớ, luôn là vấn đề với hình ảnh lớn.

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