草庐IT

image - Golang PNG 颜色操作不会达到 255

coder 2023-06-26 原文

我用作 image.png 的图像是:

当使用 254 运行我的程序时,它可以运行并且输出是:

这是我的代码。如果我将 254 更改为 255,输出文件将完全为空(大小为 0 字节):

package main

import "fmt"
import "os"
import "bufio"
import "image/png"
import "image"

func main() {
    f, _ := os.Open("image.png")
    im, _ := png.Decode(bufio.NewReader(f))
    img := im.(*image.RGBA)
    s := img.Bounds().Size()
    w := s.X
    h := s.Y
    fmt.Println(w, h)
    newPix := make([]uint8, len(img.Pix))
    iy := 0
    for ; iy < h; iy++ {
        ix := 0
        for ; ix < w; ix++ {
            i := img.PixOffset(ix, iy)
            r := img.Pix[i+0]
            g := img.Pix[i+1]
            b := img.Pix[i+2]
            a := img.Pix[i+3]
            var max uint8 = 254 /*255*/
            newPix[i+0] = uint8(max - r)
            newPix[i+1] = uint8(max - g)
            newPix[i+2] = uint8(max - b)
            newPix[i+3] = uint8(max - a)
        }
    }
    newImg := image.NewRGBA(img.Bounds())
    newImg.Pix = newPix
    o, _ := os.Create("out.png")
    defer o.Close()
    png.Encode(bufio.NewWriter(o), newImg)
    fmt.Println("DONE")
}

为什么会这样,我该如何解决? 255 仍然是 uint8,所以它应该可以工作...

最佳答案

我找到了 a discussion on the golang-nuts group这个问题以前在哪里出现过。

基本上是输出太小,自动触发writer flush。手动刷新编写器(在任何情况下都推荐)可以解决此问题。

package main

import "fmt"
import "os"
import "bufio"
import "image/png"
import "image"

func main() {
    f, _ := os.Open("image.png")
    im, _ := png.Decode(bufio.NewReader(f))
    img := im.(*image.RGBA)
    s := img.Bounds().Size()
    w := s.X
    h := s.Y
    fmt.Println(w, h)
    newPix := make([]uint8, len(img.Pix))
    iy := 0
    for ; iy < h; iy++ {
        ix := 0
        for ; ix < w; ix++ {
            i := img.PixOffset(ix, iy)
            r := img.Pix[i+0]
            g := img.Pix[i+1]
            b := img.Pix[i+2]
            a := img.Pix[i+3]
            var max uint8 = 255
            newPix[i+0] = uint8(max - r)
            newPix[i+1] = uint8(max - g)
            newPix[i+2] = uint8(max - b)
            newPix[i+3] = uint8(max - a)
        }
    }
    newImg := image.NewRGBA(img.Bounds())
    newImg.Pix = newPix
    o, _ := os.Create("out.png")
    defer o.Close()
    writer := bufio.NewWriter(o)
    png.Encode(writer, newImg)
    writer.Flush()
    fmt.Println("DONE")
}

有关忽略错误的一般注意事项适用。

关于image - Golang PNG 颜色操作不会达到 255,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22109346/

有关image - Golang PNG 颜色操作不会达到 255的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby 诅咒颜色 - 2

    如何使用Ruby的默认Curses库获取颜色?所以像这样:puts"\e[0m\e[30;47mtest\e[0m"效果很好。在浅灰色背景上呈现漂亮的黑色。但是这个:#!/usr/bin/envrubyrequire'curses'Curses.noecho#donotshowtypedkeysCurses.init_screenCurses.stdscr.keypad(true)#enablearrowkeys(forpageup/down)Curses.stdscr.nodelay=1Curses.clearCurses.setpos(0,0)Curses.addstr"Hello

  5. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  6. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  7. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  8. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  9. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  10. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

随机推荐