【问题标题】:How to determine png "type" (png8 / png24)如何确定 png“类型”(png8 / png24)
【发布时间】:2020-06-15 15:21:32
【问题描述】:

我正在使用 image 包来解码图像并确定它们的格式(例如 jpg 或 png),但是我希望更深入地了解 png 是否实际上是 png8 或 @ 987654325@.

使用 Go 执行此操作的正确方法是什么?

(更新 1)

目前我正在阅读能够解码图像,我想知道如何从这里获取颜色模型:

fname := "img.jpg"
f, err := os.Open(fname)
_, format, err := image.Decode(f)
if err != nil {
    log.Fatal(err)
}

fmt.Println(format, "format")

【问题讨论】:

  • 标准库及其 API 没有公开这些细节。您必须查看它们的源代码、复制和修改,或者寻找第 3 方库。
  • 对 Go 了解这么多 → · 但只检查文档:它不像检查报告的 color modelimage 那样简单?
  • 这就是我在阅读文档一段时间后的想法。我想我会尝试从 PHP 移植这个:stackoverflow.com/questions/57547818/php-detect-png8-or-png24 - 似乎是一个很好的解决方案
  • @usr2564301 - 我是 Go 新手,我试图获得颜色模型,但无法让它工作。我正在解码图像,但我不确定如何进行。我将在原始问题中添加更多信息。

标签: image go image-processing png


【解决方案1】:

试试这个,记住它没有健全性检查

package main

import (
    "errors"
    "fmt"
    _ "image/png"
    "os"
)

func pngType(f *os.File) (string, error) {
    f.Seek(24, 0)
    b := make([]byte, 1)
    f.Read(b)
    c := make([]byte, 1)
    f.Read(c)

    bitDepth := b[0]
    colorType := c[0]

    if bitDepth == 8 && colorType == 3 {
        return "PNG8", nil
    }

    if bitDepth == 8 && colorType == 2 {
        return "PNG24", nil
    }

    if bitDepth == 8 && colorType == 6 {
        return "PNG32", nil
    }

    return "", errors.New("unknown_type")
}

func main() {
    f, _ := os.Open("img.png")
    t, _ := pngType(f)

    fmt.Printf("The type is `%s`.\n", t)
}

您可以查看specs 以供参考

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2011-03-12
    • 2014-05-07
    • 2011-05-04
    • 2014-01-05
    • 2012-01-17
    相关资源
    最近更新 更多