Chuyển đổi ảnh ngay trong trình duyệt hoạt động thế nào (và vì sao tôi dựng nó theo cách đó)
Dov Azencot
@DovAzencotLý do cả website này tồn tại là một khoảnh khắc bất an nhỏ, ngớ ngẩn mà tôi trải qua nhiều năm trước. Tôi cần chuyển một tấm ảnh HEIC sang JPG, tôi gõ cái điều hiển nhiên vào ô tìm kiếm, và tôi rơi vào một công cụ chuyển đổi bắt tôi tải ảnh của mình lên máy chủ của họ. Thế là tôi làm theo. Nó chạy được. Rồi tôi ngồi đó nghĩ: giờ tấm ảnh đó đang nằm trên một cỗ máy nào đó tôi chẳng biết gì, do những người tôi sẽ chẳng bao giờ gặp vận hành, giữ trong một khoảng thời gian chẳng ai nói cho tôi biết. Với một ảnh chụp màn hình vu vơ thì không sao. Nhưng nó không phải ảnh chụp màn hình. Nó là một tấm ảnh cá nhân, và tôi vừa trao nó cho người lạ chỉ để tiết kiệm cho mình ba mươi giây.
Đó là vấn đề tôi quyết tâm không bao giờ gặp lại nữa. Hóa ra câu trả lời là việc tải lên chưa từng cần thiết ngay từ đầu.
Cách cũ: thuê máy tính của người lạ
Một công cụ chuyển đổi trực tuyến truyền thống hoạt động như một dịch vụ đặt hàng qua bưu điện. Bạn gửi tệp của mình lên một máy chủ. Máy chủ chạy việc chuyển đổi bằng phần mềm cài trên máy của nó. Nó gửi kết quả trở xuống. Tấm ảnh của bạn đã đi một vòng qua phần cứng bạn không kiểm soát, và đâu đó ở giữa nó nằm lại, nguyên vẹn, trên một ổ đĩa không phải của bạn.
Mọi lời hứa riêng tư gắn thêm vào mô hình đó chỉ là một lời hứa về hành vi — tệp sẽ bị xóa sau một giờ, chẳng ai xem đâu. Có thể điều đó đúng. Có thể thật. Bạn không có cách nào kiểm chứng, mà bạn đang tin giao nó với chính những byte thật của tệp mình. Sự tin tưởng chính là toàn bộ kiến trúc, và tin tưởng đúng là thứ tôi không muốn phải tiêu tốn.
Cách mới: trình duyệt của bạn đã có sẵn máy tính rồi
Đây là điều đã thay đổi. Trình duyệt hiện đại có thể chạy những chương trình thật, đã biên dịch, ở tốc độ gần như gốc, thông qua một thứ gọi là WebAssembly — gọi tắt là WASM. Những bộ mã hóa ảnh vốn từng sống trên máy chủ — mã đọc một PNG, mã hóa một WebP, giải mã HEIC — đều có thể biên dịch sang WASM và chạy ngay trong cái tab trình duyệt bạn đang mở sẵn.
Nên khi bạn thả một tệp lên một trang được dựng theo cách này, phần mềm chuyển đổi tải về máy bạn, một lần, như bất kỳ phần nào khác của trang web. Từ đó trở đi, công việc thật sự — đọc ảnh của bạn, chuyển mã, ghi tệp mới — diễn ra trên chính bộ xử lý của bạn, trong chính bộ nhớ của bạn. Kết quả được trao thẳng lại cho bạn dưới dạng một tệp tải về. Tệp của bạn không hề được gửi đi đâu, vì chẳng có nơi nào để gửi tới. Hoàn toàn không có máy chủ nào trong vòng lặp.
Đó là lý do tôi có thể nói tệp của bạn không bao giờ rời khỏi thiết bị và nói như một sự thật chứ không phải một chính sách. Không phải là tôi hứa sẽ không xem. Mà là không có con đường nào để ảnh của bạn tới được tôi. Tôi không thể lấy tấm ảnh của bạn kể cả khi tòa án ra lệnh, vì nó chưa bao giờ ở phía bên tôi của đường dây. Sự riêng tư không phải một tính năng tôi thêm vào bên trên. Nó là hệ quả của việc mã chạy ở đâu.
Cách bạn biết điều đó là thật
Bạn không cần tin lời tôi, và đó là phần tôi thích nhất. Mở công cụ phát triển của trình duyệt, theo dõi tab mạng, rồi chuyển đổi một tệp. Bạn sẽ thấy trang và bộ mã hóa WASM tải về một lần. Bạn sẽ không thấy ảnh của mình đi lên. Hay hơn nữa: nạp trang xong, tắt Wi-Fi, rồi cứ chuyển đổi thứ gì đó. Nó vẫn chạy, vì mọi thứ nó cần đã ở sẵn trên máy bạn. Một công cụ tải tệp của bạn lên thì không thể làm được điều đó. Cái này thì được.
Một giới hạn thật duy nhất
Tôi đã hứa nói thẳng, nên đây: chạy việc chuyển đổi trên chính thiết bị của bạn nghĩa là nó dùng chính bộ nhớ của bạn, mà một tab trình duyệt không được cấp bộ nhớ vô hạn để chơi.
Với những tệp thông thường — ảnh chụp, ảnh chụp màn hình, logo, những thứ người ta chuyển suốt ngày — chuyện này không thành vấn đề. Nhưng nếu bạn quăng vào một thứ thật sự khổng lồ, một tấm ảnh đơn ở độ phân giải cực đại, hay cả một loạt lớn cùng lúc, bạn có thể chạm trần. Giải mã một tấm ảnh nghĩa là giữ những pixel chưa nén của nó trong bộ nhớ, vốn lớn hơn nhiều so với tệp trên ổ đĩa, và một tấm ảnh khổng lồ có thể vét cạn phần bộ nhớ mà cái tab được phép dùng. Khi điều đó xảy ra, việc chuyển đổi chậm như rùa bò hoặc cái tab chịu thua.
Một máy chủ với 64 GB RAM chẳng bao giờ gặp vấn đề đó. Nên đây là cuộc đổi chác, nói thẳng: một công cụ chuyển đổi phía máy chủ có thể nhằn những tệp lớn hơn mức thiết bị của bạn kham nổi. Cách làm này thì không. Đổi lại nó cho bạn điều này: tệp của bạn không bao giờ rời khỏi tay bạn. Với tuyệt đại đa số thứ người ta thật sự chuyển đổi, đó là cuộc đổi chác đáng làm mà chẳng cần nghĩ ngợi lần thứ hai. Với một tệp quái vật hy hữu, đó là một giới hạn thật, và tôi thà nói cho bạn biết còn hơn vờ như nó không có.
Vì sao tôi vẫn nghĩ đây là mặc định đúng
Hầu hết các lần chuyển đổi là những tệp bình thường vốn chưa từng cần chạm tới một máy chủ ngay từ đầu. Việc tải lên luôn chỉ là tàn dư từ một thời trình duyệt chưa tự làm nổi công việc này. Giờ chúng làm được. Nên mặc định hợp lẽ đã lật ngược: giữ tệp trên máy bạn, làm việc tại chỗ, và chỉ với tới một máy chủ trong dịp hiếm hoi mà chính phần cứng của bạn thật sự không kham nổi.
Đó là toàn bộ ý tưởng đằng sau mọi thứ ở đây. Vẫn là cái website tôi dựng cho chính mình sau buổi chiều bất an ấy, để tôi không bao giờ phải trao một tấm ảnh cá nhân cho người lạ chỉ để đổi phần đuôi tệp của nó nữa. Hóa ra tôi chưa từng phải làm thế. Bạn cũng vậy.
Bài viết liên quan
Vì sao tôi chuyển PNG sang WebP (và một lần duy nhất tôi không làm thế)
PNG là định dạng tuyệt vời để chỉnh sửa nhưng lãng phí để đăng lên. Đây là những gì WebP thật sự tiết kiệm cho bạn, chỗ nó chẳng giúp gì, và một quy tắc tôi không bao giờ phá.
PNG hay JPG? Quy tắc mười năm tôi dùng để quyết
Không mất dữ liệu so với mất dữ liệu, cạnh sắc so với ảnh chụp, trong suốt so với không. Một câu hỏi đơn giản cho bạn biết tệp nên là định dạng nào — kèm bảng dung lượng thật để chứng minh.
Vì sao ảnh iPhone của bạn là HEIC (và khi nào cứ đổi sang JPG)
HEIC thật sự là định dạng tốt hơn mà một nửa web vẫn không mở nổi. Đây là lý do Apple chọn nó, thứ bạn thật sự đánh đổi khi sang JPG, và khi nào tôi không bận tâm.
Tất cả bài viết