Thư viện viết bằng ngôn ngữ Scala: AWScala S3 và Scrimage

1.Giới thiệu

Trong quá trình thực hiện dự án, thường phát sinh yêu cầu liên quan tới chức năng lưu trữ ảnh đại diện, ảnh trong nội dung các bài viết. Một trong số các giải pháp hiệu quả là sử dụng dịch vụ lưu trữ được Amazon cung cấp – Amazon Simple Storage Service (Amazon S3), kết hợp với việc điều chỉnh kích thước, độ phân giải của hình ảnh.
Bài viết xin được tổng hợp về 2 thư viện dành cho ngôn ngữ Scala :
+ AWScala: thư viện về các dịch vụ của Amazon. Ví dụ qua kết nối với Amazon S3.
+ Scrimage: thư viện xử lý, thao tác với các tệp tin hình ảnh. Ví dụ qua việc thay đổi độ phân giải của ảnh.

2. Thư viện AWScala

Repository link: https://github.com/seratch/AWScala
AWScala là thư viện kết nối và thao tác với các dịch vụ cung cấp bởi Amazon: IAM, STS, Amazon EC2, Amazon S3, …
AWScala có thể tích hợp với Play framework
– Khai báo trong application.conf

libraryDependencies += "com.github.seratch" %% "awscala" % "0.3.+"
  • Khởi tạo S3 và upload file
import awscala.Region
import awscala.s3.{ Bucket, S3 }

implicit val s3 = S3(S3_ID, S3_SECRECT_KEY)(Region.Tokyo)
// upload file to S3 and return public url
def uploadFileToS3(file: File, fileNameToS3: String): Try[String] = Try {
    val bucket = Bucket(S3_BUCKET_ID)
    bucket.putAsPublicRead(fileNameToS3, file)
    bucket.getObject(fileNameToS3) match {
      case Some(obj) => {
        obj.publicUrl.toString
      }
      case _ => throw new Exception("Upload failed")
    }
  }
  • Lưu ý
    Mỗi tài khoản Amazon có thể tạo nhiều cặp (S3_ID, S3_SECRECT_KEY) với quyền truy cập khác nhau. Từ đó ta chỉ có thể sử dụng các hàm trong thư viện AWScala S3 có quyền truy cập tương ứng. Ví dụ nếu cặp (S3_ID, S3_SECRECT_KEY) chỉ cho phép đọc, ghi trong 1 bucket định sẵn thì khi ta sử dụng các hàm có dạng
  val buckets: Seq[Bucket] = s3.buckets
  val bucket: Bucket = s3.createBucket("unique-name-xxx")

Kết quả sẽ là lỗi

Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: B48B6E7CD097E4B1)"

3. Thư viện Scrimage

Repository link : https://github.com/sksamuel/scrimage
Scrimage là bộ thư viện dành cho việc xử lý hình ảnh, hỗ trợ các chức năng thường dùng như: copy, flip, filter, resize, rotate, scale, …
– Thực hiện thay đổi kích thước của một ảnh về thông số định sẵn

import com.sksamuel.scrimage._

def scaleImage(imagePath): Unit = {
    val inputFile: File = new File(imagePath)
    Image.fromFile(inputFile).scaleTo(200, 200).output(new File("/path/to/output/file"))
}

Lưu ý
– Sử dụng resize hay scale:
+ resize (resizeTo): Hàm resize không thay đổi độ phân giải của ảnh mà chỉ thay đổi phần khung chứa ảnh (canvas). Nếu tham số truyền vào lớn hơn độ phân giải của ảnh gốc, thì ảnh sẽ được bao thêm bên ngoài bởi một phần nền. Nếu tham số truyền vào nhỏ hơn độ phân giải của ảnh gốc, ảnh sẽ được “cắt” lấy một khoảng bằng đúng tham số truyền vào
+ scale (scaleTo): Hàm scale thay đổi cả độ phân giải và phần khung chứa ảnh (canvas)
Do đó, nếu muốn đưa ảnh về một kích thước chính xác mong muốn, ta sử dụng scale (scaleTo) mà không dùng resize (resizeTo). Ngược lại, hàm resize (resizeTo) tương ứng với việc crop bức ảnh.
– Sử dụng writer
Scrimage cung cấp một số writer hỗ trọ ghi ra các định dạng khác nhau: JpegWriter, PngWriter, GifWriter. Trong đó, JpegWriter có hiệu quả trong việc giảm dung lượng của ảnh, tuy nhiên sẽ khiến chất lượng ảnh giảm xuống.

  • Cách sử dụng writer
  Image.fromFile(inputFile).scaleTo(200, 200).output(new File("/path/to/output/file"))(JpegWriter())
    
  • Các ảnh gif động khi được dùng trong hàm resize hoặc scale sẽ trở thành ảnh tĩnh

4. Kết luận

Bài viết đã giới thiệu về hai thư viện: AWScala – ví dụ kết nối với Amazon S3, Scrimage – ví dụ chuyển đổi độ phân giải của ảnh.
Ngoài ra trong hai thư viện trên còn nhiều chức năng và tiện ích khác, thích hợp để chúng ta sử dụng và kết hợp linh hoạt.

Add a Comment

Scroll Up