mirror of
https://github.com/mickael-kerjean/filestash.git
synced 2025-10-28 04:05:21 +08:00
54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
package plg_image_transcode
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
. "github.com/mickael-kerjean/filestash/server/common"
|
|
"github.com/suyashkumar/dicom"
|
|
"github.com/suyashkumar/dicom/pkg/tag"
|
|
"image/jpeg"
|
|
"io"
|
|
)
|
|
|
|
func transcodeDicom(reader io.Reader) (io.ReadCloser, string, error) {
|
|
var b bytes.Buffer
|
|
w := bufio.NewWriter(&b)
|
|
io.Copy(w, reader)
|
|
|
|
dataset, err := dicom.Parse(&b, int64(len(b.Bytes())), nil)
|
|
if err != nil {
|
|
Log.Debug("plg_image_transcode::dicom::parse '%s'", err.Error())
|
|
return nil, "", ErrNotValid
|
|
}
|
|
pixelDataElement, err := dataset.FindElementByTag(tag.PixelData)
|
|
if err != nil {
|
|
Log.Debug("plg_image_transcode::dicom::findElementByTag '%s'", err.Error())
|
|
return nil, "", ErrNotValid
|
|
}
|
|
pixelDataInfo := dicom.MustGetPixelDataInfo(pixelDataElement.Value)
|
|
|
|
for _, fr := range pixelDataInfo.Frames {
|
|
img, err := fr.GetImage()
|
|
if err != nil {
|
|
if err.Error() == "unsupported JPEG feature: unknown marker" {
|
|
// known issue with lossless jpeg codec which isn't supported in golang
|
|
// and is not trivial to support in Filestash
|
|
return nil, "", ErrNotImplemented
|
|
}
|
|
Log.Stdout("plg_image_transcode_dicom::getImage '%s'", err.Error())
|
|
return nil, "", err
|
|
}
|
|
|
|
r, w := io.Pipe()
|
|
go func() {
|
|
err := jpeg.Encode(w, img, &jpeg.Options{Quality: 80})
|
|
w.Close()
|
|
if err != nil {
|
|
Log.Debug("plg_image_transcode::dicom jpeg encoding error '%s'", err.Error())
|
|
}
|
|
}()
|
|
return NewReadCloserFromReader(r), "image/jpeg", nil
|
|
}
|
|
return nil, "", ErrNotValid
|
|
}
|