【问题标题】:how to set DPI using Golang?如何使用 Golang 设置 DPI?
【发布时间】:2018-12-16 22:24:48
【问题描述】:

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)) 来实现这一点,但实际上,每次我查看代码时都对它感到厌恶。

【问题讨论】:

    标签: image go jfif


    【解决方案1】:

    我相信您正在寻找 exif 值 XResolutionYResolution

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

    https://github.com/dsoprea/go-exif 可以让你修改 exif 数据。

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

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答。当我有空的时候,我会尝试你的方法,但这个想法听起来很有希望。顺便说一句,图书馆并没有按照名称显示的那样做。当我几天前检查时,它只能解析 exif 信息。当我有更多更新时会添加更多评论。
    • 抱歉回复晚了。直到这周我才有时间验证。郑重声明,go-exif 不是添加 exif 信息的可行包。 media.mit.edu/pia/Research/deepview/exif.html 是一篇好文章,概述了应该设置哪些字节来将新的 exif 写入文件。
    【解决方案2】:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多