Skip to content

Instantly share code, notes, and snippets.

@eikeon
Last active October 5, 2015 18:08
Show Gist options
  • Save eikeon/2851482 to your computer and use it in GitHub Desktop.
Save eikeon/2851482 to your computer and use it in GitHub Desktop.
package main
// #cgo LDFLAGS: -lawj2k
// #include <j2k.h>
import "C"
import (
"unsafe"
"log"
"flag"
"net/http"
)
const MAX_PROGRESSION_LEVEL = uint(6)
const FULL_XFORM_FLAG = 0
func scaled_dimension(progression_level uint, dimension uint32) uint32 {
scale_factor := uint(2)<<(progression_level-uint(1))
return uint32(float32(dimension) / float32(scale_factor))
}
func desired_progression_level(x1, x2, y1, y2, width, height uint32) uint {
level := MAX_PROGRESSION_LEVEL
for ; level > 1 && width > scaled_dimension(level, x2 - x1) && height > scaled_dimension(level, y2 - y1); level-- {
}
return level
}
func TileHandler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "image/jpeg")
x1, y1, x2, y2 := uint32(100), uint32(100), uint32(500), uint32(500)
width, height := uint32(400), uint32(400)
//x1, y1, x2, y2 := uint32(1022), uint32(2046), uint32(1538), uint32(2562)
//width, height := uint32(258), uint32(258)
var obj unsafe.Pointer
if err := C.aw_j2k_create(&obj); err != 0 {
panic("create failed")
}
defer func() {
C.aw_j2k_destroy(obj)
}()
if err := C.aw_j2k_set_input_image_file(obj, C.CString("0001.jp2")); err != 0 {
panic("set input failed")
}
if err := C.aw_j2k_set_input_j2k_region_level(obj, C.ulong(x1), C.ulong(y1), C.ulong(x2), C.ulong(y2)); err != 0 {
panic("set input region level failed")
}
if err := C.aw_j2k_set_output_com_image_size(obj, C.long(height), C.long(width), C.AW_J2K_PRESERVE_ASPECT_RATIO_NO_PAD); err != 0 {
panic("set output size failed")
}
level := desired_progression_level(x1, x2, y1, y2, width, height)
if err := C.aw_j2k_set_input_j2k_resolution_level(obj, C.int(level), C.int(FULL_XFORM_FLAG)); err != 0 {
panic("set resolution level failed")
}
// var cols, rows, bpp, nChannels C.ulong
// if err := C.aw_j2k_get_input_image_info(obj, &cols, &rows, &bpp, &nChannels); err != 0 {
// panic(":|")
// }
// log.Println("cols:", cols, "rows:", rows)
var image_buffer *C.uchar
var image_buffer_length C.ulong
if err := C.aw_j2k_get_output_image_type(obj, C.int(C.AW_J2K_FORMAT_JPG), &image_buffer, &image_buffer_length); err != 0 {
log.Println("err:", err)
panic("get output import failed")
}
//log.Println("buffer:", image_buffer, "length:", image_buffer_length)
//aw_j2k_free(obj, image_buffer)
w.Write(C.GoBytes(unsafe.Pointer(image_buffer), C.int(image_buffer_length)))
}
func main() {
Address := flag.String("address", ":8888", "http service address")
flag.Parse()
http.Handle("/", http.HandlerFunc(TileHandler))
if err := http.ListenAndServe(*Address, nil); err != nil {
log.Print("ListenAndServe:", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment