dsc6517 2014-12-31 06:30
浏览 38
已采纳

将额外的数据写入io.Writer

I am trying to figure out how to change the behaviour of jpeg.Encode API (http://golang.org/pkg/image/jpeg/#Encode) that takes an io.Writer as a parameter and writes the file to it.

I need to insert a set of bytes after the first two bytes written in to the file, and I think it is possible to do without keeping everything in memory. I am new to Golang, I found io.Pipe that connects a reader and a writer, but I do not understand how to use it for what I need.

Could someone help?

EDIT: should I just implement my own io.Writer interface?

  • 写回答

2条回答 默认 最新

  • duanran6441 2014-12-31 09:56
    关注

    If you know upfront the bytes you need to add in the stream (whatever the stream, image or not), building a Writer object for this specific purpose is not really hard.

    Here is an example:

    package main
    
    import (
        "fmt"
        "image"
        "image/draw"
        "image/jpeg"
        "image/color"
        "os"
        "io"
    )
    
    type ByteInserter struct {
        n   int
        b   []byte
        pos int
        w   io.Writer
    }
    
    func NewByteInserter(w io.Writer) *ByteInserter {
        return &ByteInserter{w:w}
    }
    
    func (bi* ByteInserter) Set( b[]byte, pos int ) {
        bi.b = b
        bi.pos = pos
    }
    
    func (bi *ByteInserter) Write( p []byte ) (n int, err error) {
        if bi.n>bi.pos || bi.n+len(p)<=bi.pos {
            n, err = bi.w.Write(p)
            bi.n += n
        } else {
            cut := bi.pos-bi.n
            if cut > 0 {
                n,err = bi.w.Write(p[:cut])
                bi.n += n
                if err != nil {
                    return
                }
            }
            _,err = bi.w.Write(bi.b)
            if err != nil {
                return
            }
            n2 := 0
            n2, err = bi.w.Write(p[cut:])
            bi.n += n2
            n += n2
        }
        return
    }
    
    func main() {
    
        // Blue rectangle, stolen from Nigel Tao's post
        // http://blog.golang.org/go-imagedraw-package
        img := image.NewRGBA(image.Rect(0, 0, 640, 480))
        blue := color.RGBA{0, 0, 255, 255}
        draw.Draw(img, img.Bounds(), &image.Uniform{blue}, image.ZP, draw.Src)
    
        file, err := os.Create("file.jpg")
        if err != nil {
            panic(err)
        }
    
        bi := NewByteInserter(file)
        bi.Set( []byte("XXX"), 2 )   // Three bytes added at position 2
        jpeg.Encode(bi,img,nil)
        file.Close()
    
        fmt.Println("Written!")
    }
    

    That said, editing a stream to customize an image seems really hackish to me.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办