- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试写一个简短的,它将读取一个 PNG 文件,并将一个 channel 与另一个 channel (R,G,B) 交换作为可能的选择。
但是,我无法找到如何从 image.At(x,y) 返回的 color.Color 对象中提取整数。一旦我可以用交换的 channel 构造新的 RGBA 颜色,使用 image.Set(x,y,color) 写回它可能会更容易。
我现在在这里(你几乎可以跳到最后一个循环):
gói chính
nhập khẩu (
"lá cờ"
"fmt"
//"image"
"image/color"
"hình ảnh/png"
"os"
)
type Choice struct {
value string
valid bool
}
func (c *Choice) validate() {
goodchoices := []string{"R", "G", "B"}
for _, v := range goodchoices {
if c.value == v {
c.valid = true
}
}
}
hàm main() {
var fname string
var c1 Choice
var c2 Choice
flag.StringVar(&c1.value, "c1", "", "The color channel to swap - R or G or B ")
flag.StringVar(&c2.value, "c2", "", "The color channel to swap with - R or G or B ")
flag.StringVar(&fname, "f", "", "A .png image (normal map)")
flag.Parse()
c1.validate()
c2.validate()
if c1.valid == true && c2.valid == true {
fmt.Println("We could proceed..")
fmt.Println("Swapping channels:", c1.value, "<->", c2.value, "In", fname) //for testing
} khác {
fmt.Println("Invalid channel... Please use R, G or B.")
trở lại
}
file, err := os.Open(fname)
nếu err != nil {
fmt.Println(err)
trở lại
}
defer file.Close()
pic, err := png.Decode(file)
nếu err != nil {
fmt.Fprintf(os.Stderr, "%s: %v\n", fname, err)
trở lại
}
b := pic.Bounds()
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
col := pic.At(x, y)
???? How do I swap the channels in col ????
}
}
}
我对 Go 和一般编程真的很陌生,所以请在您的回答中考虑一下。谢谢。
câu trả lời hay nhất
嗯,这比我想象的要难 - 我想知道是否有人能想出更好的主意!
问题是您不知道 png.Decode
返回的具体类型 - 它可能返回任何图像类型。您只有一个没有 Set 方法的 hình ảnh.Hình ảnh
接口(interface)。
为了解决这个问题,首先定义一个接口(interface),所有可以设置像素的图像类型都满足
type ImageSet interface {
Set(x, y int, c color.Color)
}
接下来看看 pic
是否实现了那个接口(interface)(如果没有实现,go 会 panic - 使用 picSet,如果这让你感到困扰,就可以了)
// Get an interface which can set pixels
picSet := pic.(ImageSet)
现在你的循环看起来像这样 - 我只交换了红色和绿色所以你可以看到这个想法。
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
col := pic.At(x, y)
r, g, b, a := col.RGBA()
// Swap green and red
newCol := color.RGBA{uint8(g>>8), uint8(r>>8), uint8(b>>8), uint8(a>>8)}
picSet.Set(x, y, newCol)
}
}
我怀疑这个的高性能版本必须使用类型开关来确定它是哪种图像类型,然后为每个图像类型定制代码,其中 uint8s 用于 24 位图像,uint16s 用于 48 位图像等。
Here is the complete working例如,如果你想试一试。但它在 playground 中不起作用 - 你必须下载它。
gia hạn:刚刚注意到您的评论。如果您知道自己有 RGBA 图像,那么您可以使用类型断言来获取底层图像,这会让事情变得容易得多。
// Get an image.RGBA if it is one
rgba, ok := pic.(*image.RGBA)
nếu !ok {
fmt.Println("That wasn't an RGBA!")
trở lại
}
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
// Note type assertion to get a color.RGBA
col := rgba.At(x, y).(color.RGBA)
// Swap green and red
col.G, col.R = col.R, col.G
rgba.Set(x, y, col)
}
}
关于image - Golang - 使用 Image 和 Image/PNG 交换图片的 PNG channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652060/
Tôi đang cố chạy mã này để thay thế một ký tự trong chuỗi bằng một số ngẫu nhiên: //Lấy vị trí giữa 0 và độ dài của chuỗi-1 để chèn
Tôi có một mảng có 3 vị trí, giả sử tất cả các vị trí của nó là số 5. [5 5 5] Làm cách nào tôi có thể chuyển nó tới một var theo cách giữ nguyên 555? Cứ như thế này. n:= 555 Câu trả lời đúng nhất cũng giống như bất kỳ ngôn ngữ nào khác:
Mình đang dùng go dep tool phiên bản v0.4.1, bây giờ khi chạy dep init nó tạo ra 2 file như mong đợi, khi mở gopkg.lock mình thấy ví dụ như tên [[projects]] sau
我正在制作学习联系申请。我有一个 NewContact()。 // Contact - defines the fields of an entire Contact type Contact str
我一直在尝试使用该模块: https://godoc.org/github.com/hirochachacha/go-smb2#RemoteFile.ReadAt 为了在 Windows 机器上对我的
我需要在 golang 中编译 golang 中的程序。有没有不使用 exec.Command("go","build") 的原生形式? 最佳答案 不幸的是,我认为使用 exec.Command 是利
编写输出有效 go 代码的 go 应用程序可能最好使用内置的“go”包及其一些子包(“go/ast”、“go/token”、“go/printer”、等)。 要创建字符串文字表达式,您需要创建一个 a
我正在尝试使用 Golang 和 gin 为我的 api 和前端编写代理。如果请求转到除“/api”之外的任何内容,我想代理到 svelte 服务器。如果出现“/api/something”,我想在
我偶然发现了这个博客:using go as a scripting language并尝试创建一个可用于运行 golang 脚本的自定义图像,即 FROM golang:1.15 RUN go ge
我刚开始接触golang,我需要从json字符串中获取数据。 {"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "di
đóng cửa. Câu hỏi này dựa trên ý kiến. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện câu hỏi này? Cập nhật câu hỏi để việc chỉnh sửa bài đăng này có thể trả lời nó bằng các sự kiện và trích dẫn. Đã đóng 3 năm trước. Cải thiện
我是 goland 的新手,试图在我的第一个项目中使用它。我注意到在 goland 中它没有显示通过容器引入的相同 golang SDK。 这是我的 Dockerfile: FROM golang:1
我正在试用 golang-neo4j-bolt-driver 包 github.com/johnnadratowski/golang-neo4j-bolt-driver 我已经导入了包并正在使用创建新
如果我安装了Go发行版软件包,则会在/usr/lib/golang/pkg中看到很多文件,在/usr/lib/golang/src中看到非常相似的文件集。这两组之间有什么关系? pkg是从src中的源
我发现 golang 上下文对于在客户端-服务器请求范围内取消服务器的处理很有用。 我可以使用 http.Request.WithContext 方法发出带有上下文的 http 请求,但是如果客户端不
我正在尝试将一个 golang 数组(还有 slice、struct 等)放置到 HTML 中,这样当从 golang gin web 框架返回 HTML 时,我可以在 HTML 元素内容中使用数组元
目前正在使用这个 ffmpeg 命令编辑视频 ffmpeg -i "video1.ts" -c:v libx264 -crf 20 -c:a aac -strict -2 "video1-fix.ts
我需要从 play.golang.org 链接读取 golang 代码并保存到 .go 文件。我想知道 play.golang.org 是否有任何公共(public) API 支持。我用谷歌搜索但没有
我第一次使用 IntelliJ 的最新 (2014-01-03) Golang 插件。 通常,我的终端工作流程是 go build && ./executable -args=1 所以我试图创建一个启
这个问题只是在构建之间随机出现,现在甚至我们的生产 repo,几个月都没有改变,在构建时也会出现这个问题。我已经坚持了一段时间。它不会发生在我们的本地机器上,只有在使用 dockerfile 时才会发
Tôi là một lập trình viên xuất sắc, rất giỏi!