13.5. Cho tập lệnh của chúng ta vài thứ có giá trị

Hãy tiếp tục bài học và thêm một số chức năng cho tập lệnh của chúng ta.

Tạo ra một ảnh mới

Trong bài học trước, chúng ta đã tạo ra một hàm rỗng và đăng ký nó vào GIMP. Trong bài học này, chúng muốn đưa chức năng vào tập lệnh của chúng ta -- chúng ta muốn tạo ra một ảnh mới, thêm chữ của người dùng vào nó và thay đổi kích thước của ảnh cho nó vừa khít với chữ.

Một khi bạn đã biết cách thiết lập các biến, định nghĩa các hàm số và truy nhập vào các "thành viên" của danh sách, phần còn lại chỉ là "đổ dốc" mà thôi -- tất cả những gì bạn cần là làm quen với các hàm số có trong cơ sở dữ liệu thủ tục của GIMP và gọi những hàm số đó một cách trực tiếp. Vì thế hãy "đốt lò" trình duyệt DB Browser lên và chúng ta hãy cùng "nấu nướng"!

Hãy bắt đầu bằng cách tạo ra một ảnh mới. Chúng ta sẽ tạo ra một biến mới, theImage, thiết lập về kết quả của việc gọi hàm có sẵn trong GIMP là gimp-image-new.

Như bạn có thể thấy trong trình duyệt DB Browser, hàm số gimp-image-new lấy ba tham số -- chiều rộng, chiều cao và kiểu của ảnh. Bởi vì sau này chúng ta sẽ thay đổi kích thước của ảnh cho nó phù hợp với chữ, chúng sẽ tạo ra một ảnh RGB 10x10. Chúng ta cũng sẽ lưu chiều rộng và các kích thước của ảnh trong một vài biến, vì chúng ta sẽ tham chiếu và xử lý chúng sau trong tập lệnh.

        (define (script-fu-text-box inText inFont inFontSize inTextColor)
        (let*
              (
                 ; define our local variables
                 ; create a new image:
                 (theImageWidth  10)
                 (theImageHeight 10)
                 (theImage (car 
                                (gimp-image-new
                                 theImageWidth
                                 theImageHeight
                                 RGB
                                )
                           )
                 )
                 (theText)     ;a declaration for the text
                               ;we create later
      

Ghi chú: Chúng ta đã sử dụng giá trị RGB để chỉ định rằng đó là một ảnh RGB. Chúng ta cũng có thể sử dụng 0, nhưng RGB có tính chất mô tả tốt hơn khi chúng ta đọc mã.

Bạn cũng lưu ý thấy rằng chúng ta lấy phần đầu của kết quả của phép gọi hàm. Điều này có vẻ như hơi lạ, vì cơ sở dữ liệu cho chúng ta biết rõ ràng là nó chỉ trả về một giá trị -- "danh tính" (ID) của ảnh mới tạo thành. Tuy nhiên, tất cả các hàm GIMP trả về một danh sách, thậm chí ngay cả khi chỉ có một yếu tố trong danh sách, do vậy chúng ta phải lấy phần đầu của danh sách.

Thêm một lớp mới vào ảnh

Bây giờ khi chúng ta đã có một ảnh, chúng ta cần thêm một lớp mới vào nó. Chúng ta sẽ gọi hàm gimp-layer-new để tạo lớp, truyền vào danh tính của ảnh chúng ta mới tạo ra. (Từ bây giờ trở đi, thay vì liệt kê hàm đầy đủ, chúng ta sẽ chỉ liệt kê những dòng chúng ta thêm vào). Bởi vì chúng ta đã khai báo tất cả các biến cục bộ, chúng ta cũng sẽ đóng ngoặc đơn để đánh dấu việc kết thúc các khai báo biến của chúng ta:

        ;create a new layer for the image:
           (theLayer 
                     (car
                          (gimp-layer-new
                           theImage
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           "layer 1"
                           100
                           NORMAL
                          )
                      )
            )
         ) ;end of our local variables
      

Một khi đã có lớp mới, chúng ta cần thêm nó vào ảnh:

       (gimp-image-add-layer theImage theLayer 0)
      

Bây giờ, chỉ để thử cho vui chút thôi, hãy xem thành quả công sức lao động của chúng ta cho đến thời điểm này nhé, và thêm dòng dưới đây vào để hiển thị một ảnh mới, rỗng:

        (gimp-display-new theImage)
      

Lưu công việc của bạn lại, chọn Xtns->Script-Fu->Refresh, chạy tập lệnh và một ảnh mới sẽ xuất hiện. Nó có thể chỉ toàn thứ vớ vẩn (các màu ngẫu nhiên), bởi vì chúng ta đã không xóa nó. Chúng ta sẽ đến phần đó ngay thôi.

Thêm chữ

Hãy tiến lên và xóa đi dòng hiển thị ảnh (hoặc đổi nó thành ghi chú bằng cách thêm dấu ; vào đầu dòng đó).

Trước khi chúng ta thêm chữ vào ảnh, chúng ta cần thiết lập màu nền trước và nền sau sao cho chữ xuất hiện theo màu chúng ta chỉ định. Chúng ta sẽ sử dụng các hàm gimp-palette-set-back/foreground:

        (gimp-context-set-background '(255 255 255) )
        (gimp-context-set-foreground inTextColor)
      

Với các màu được thiết lập đúng, bây giờ chúng ta hãy dọn "rác" hiện có trong ảnh  bằng cách đổ màu vùng có thể vẽ bằng màu nền sau:

        (gimp-drawable-fill theLayer BACKGROUND-FILL) 
      

Với ảnh đã được dọn sạch, bây giờ chúng ta đã sẵn sàng để thêm chữ vào:

        (set! theText
                      (car
                           (gimp-text-fontname
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize PIXELS
                            "Sans")
                       )
        )  
      

Mặc dù ở trên là một phép gọi hàm dài, thực ra nó khá trực quan nếu bạn nhìn các tham số và quan sát mục vào (entry) của hàm trong DB Browser. Về cơ bản, chúng ta đang tạo ra một lớp mới và gán nó vào biến theText.

Bây giờ khi đã có chữ, chúng ta ta có thể lấy chiều rộng và chiều cao của nó và thay đổi kích thước ảnh và lớp ảnh cho  bằng với kích thước chữ:

        (set! theImageWidth   (car (gimp-drawable-width  theText) ) )  	
        (set! theImageHeight  (car (gimp-drawable-height theText) ) )

        (gimp-image-resize theImage theImageWidth theImageHeight 0 0)	
  	
        (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
      

Nếu bạn giống tôi, có lẽ bạn đang tự hỏi drawable (có thể vẽ được) nghĩa là gì khi so sánh nó với một lớp. Sự khác biệt giữa hai khái niệm này là "có thể vẽ được" là bất kỳ thứ gì mà ta có thể vẽ được vào đó, kể cả các lớp cũng như các kênh, các mặt nạ lớp, phép chọn,...; một lớp là một phiên bản đặc thù hơn của một "có thể vẽ được". Trong hầu hết các trường hợp, sự phân biệt hai thứ này không quan trọng.

Với ảnh đã sẵng sàng, bây giời chúng ta có thể thêm lại dòng hiển thị của chúng ta:

        (gimp-display-new theImage)
      

ãy lưu công việc của bạn lại, làm tươi (refresh) lại cơ sở dữ liệu và cho tập lệnh của bạn chạy thử lần đầu!

"Dọn dẹp" cờ "bẩn"

Nếu bạn thử đóng một ảnh được tạo ra mà không lưu nó trước, GIMP sẽ hỏi bạn có muốn lưu lại công việc của mình không trước khi bạn đóng ảnh. Nó hỏi bởi vì ảnh được đánh dấu là "bẩn", hoặc chưa được lưu. Trong trường hợp tập lệnh của chúng ta, điều này gây phiền toái nhiều lúc khi chúng ta chỉ đơn giản chạy thử và không thêm hoặc thay đổi thứ gì trong ảnh tạo thành -- có nghĩa là, công việc của chúng ta có thể được làm lại một cách dễ dàng với một tập lệnh đơn giản như vậy, vì thế điều hợp lý là loại bỏ cái "cờ bẩn" này.

Để làm điều này, chúng ta có thể dọn sạch cái "cờ bẩn" này sau khi hiển thị ảnh:

        (gimp-image-clean-all theImage)
      

Lệnh trên sẽ thiết lập phép đếm "vết bẩn" về 0, làm cho nó trở thành một ảnh "sạch".

Có nên thêm dòng này hay không tùy thuộc vào "khẩu vị" của từng người. Tôi sử dụng các tập lệnh để tạo ra các ảnh mới, khi mà kết quả tạo thành là không quan trọng, như trong trường hợp này. Nếu tập lệnh của bạn rất phức tạp, hoặc nếu nó hoạt động trên một ảnh đang mở, có lẽ bạn không muốn sử dụng hàm trên.