4

Golang 图像包在某种程度上非常方便,但缺乏设置图像 DPI 的支持。我检查了生成文件的文件头,FF D8 FF DB看起来像 jpeg raw。AFAIK,raw 不像 jfif 那样带有 DPI。所以这是我的问题,如何设置生成图像的 DPI?或者如何将 raw 转换为 jfif,我知道我可以从中编辑文件的特定位来设置 DPI?以前我在我的应用程序中嵌入了一个 AdvancedBatchConverter 可执行文件,并且曾经exec.Command(fmt.Sprintf("%s/AdvancedBatchConverter/abc.exe", cwd), outputFile, "/jfif", fmt.Sprintf("/convert=%s", jfifFileName)) 这样做过,但实际上,每次我查看代码时都对它感到厌恶。

4

2 回答 2

1

我相信您正在寻找 exif 值XResolutionYResolution

我的理解是原生 jpeg 编码器没有 exif 数据的任何选项。

https://github.com/dsoprea/go-exif将让您修改 exif 数据。

此外,我相信如果您首先将 jpeg 写入 bytes.Buffer 或类似内容,然后附加 exif,您可以在内存中完成整个操作,而无需先刷新到磁盘。

我希望这会有所帮助。

于 2019-01-25T05:17:42.450 回答
1

github.com/dsoprea/go-exif/v2 可以读写exif数据。与其他包 github.com/dsoprea/go-jpeg-image-structure 这里是代码示例。用于将 DPI(XResolution, YResolution) 写入图像。

import( 
    exif2 "github.com/dsoprea/go-exif/v2"
    exifcommon "github.com/dsoprea/go-exif/v2/common"
    jpegstructure "github.com/dsoprea/go-jpeg-image-structure"
)
func SetExifData(filepath string) error {
jmp := jpegstructure.NewJpegMediaParser()

intfc, err := jmp.ParseFile(filepath)
log.PanicIf(err)

sl := intfc.(*jpegstructure.SegmentList)

// Make sure we don't start out with EXIF data.
wasDropped, err := sl.DropExif()
log.PanicIf(err)

if wasDropped != true {
    fmt.Printf("Expected the EXIF segment to be dropped, but it wasn't.")
}

im := exif2.NewIfdMapping()

err = exif2.LoadStandardIfds(im)
log.PanicIf(err)

ti := exif2.NewTagIndex()
rootIb := exif2.NewIfdBuilder(im, ti, exifcommon.IfdPathStandard, exifcommon.EncodeDefaultByteOrder)

err = rootIb.AddStandardWithName("XResolution", []exifcommon.Rational{{Numerator: uint32(96), Denominator: uint32(1)}})
log.PanicIf(err)

err = rootIb.AddStandardWithName("YResolution", []exifcommon.Rational{{Numerator: uint32(96), Denominator: uint32(1)}})
log.PanicIf(err)

err = sl.SetExif(rootIb)
log.PanicIf(err)

b := new(bytes.Buffer)

err = sl.Write(b)
log.PanicIf(err)

if err := ioutil.WriteFile(filepath, b.Bytes(), 0644); err != nil {
    fmt.Printf("write file err: %v", err)
}
return nil
}
于 2020-04-29T01:45:48.030 回答