go语言image、file、base64、buffer之间的互相转换

43 篇文章 1 订阅
30 篇文章 0 订阅

前言

本笔记只作为学习笔记,本次参考内容来自以下链接:

https://studygolang.com/articles/2581
https://studygolang.com/pkgdoc
https://zhuanlan.zhihu.com/p/339477329

image

image包实现了一个基本的2D图像库,该包中包含基本的接口叫做image,这个里面包含color,这个将在image/color中描述,

image接口的值创建方式有如下几种:

1调用NewRGBA和NewPaletted

2解码一个包含gif.jpen或者png格式的image数据的io.Reader

首先介绍一些image接口

type Image    //image是一个从颜色模型中采取color.Color的矩形网格
type Image interface {
	ColorModel() color.Model //ColorModel 返回图片的 color.Model
	Bounds() Rectangle    //图片中非0color的区域
	At(x, y int) color.Color  //返回指定点的像素color.Color
}

任何一个struct只要实现了image中的三个方法,便实现了image接口。

总的来说,image存放了一个图像的全部信息,可以通过使用image,对图像进行转换和处理。

file

// File represents an open file descriptor.
type File struct {
	*file // os specific
}

File代表一个文件描述对象。

base64

百度百科中对base64的描述如下:

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。

也就是说:Base64就是包括小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"一共64个字符的字符集,(另加一个“=”,实际是65个字符)。任何符号都可以转换成这个字符集中的字符,这个转换过程就叫做base64编码。
知乎大佬的图(我不知道怎么去水印)
base64的转换:

首先将字符串(图片等)转换成二进制序列,然后按每6个二进制位为一组,分成若干组,如果不足6位,则低位补0。每6位组成一个新的字节,高位补00,构成一个新的二进制序列,最后根据base64索引表中的值找到对应的字符。

总的来说:base64对于我来说可以用来做图片类型的转换,从而将图片存储在文件中或进行其他操作。

buffer

对于go语言来说:

buffer 是缓冲器的意思,Go语言要实现缓冲读取需要使用到 bufio 包。bufio 包本身包装了 io.Reader 和 io.Writer 对象,同时创建了另外的 Reader 和 Writer 对象,因此对于文本 I/O 来说,bufio 包提供了一定的便利性。
buffer 缓冲器的实现原理就是,将文件读取进缓冲(内存)之中,再次读取的时候就可以避免文件系统的 I/O 从而提高速度。同理在进行写操作时,先把文件写入缓冲(内存),然后由缓冲写入文件系统。

相互转换

package main

import (
	"bytes"
	"encoding/base64"
	"fmt"
	"image"
	"image/jpeg"
	"io/ioutil"
	"os"
)
func showErr(err error){
	if err!=nil {
		panic(err)
	}
}

func main() {
	/*
	https://studygolang.com/articles/2581
	https://www.cnblogs.com/ghj1976/p/3443638.html
	 */

	//base64 -> file
	//成图片文件并把文件写入到buffer
	ddd, _ := base64.StdEncoding.DecodeString("./test.jpg")
	//buffer输出到jpg文件中(不做处理,直接写到文件)
	err2 := ioutil.WriteFile("./output.jpg", ddd, 0666)
	showErr(err2)


	//base64 -> buffer
	ddd2, _ := base64.StdEncoding.DecodeString("./test.jpg") //成图片文件并把文件写入到buffer
	bbb := bytes.NewBuffer(ddd2)                           	// 必须加一个buffer 不然没有read方法就会报错

	//buffer-> ImageBuff
	m, _, _ := image.Decode(bbb)                            // 图片文件解码
	rgbImg := m.(*image.YCbCr)
	subImg := rgbImg.SubImage(image.Rect(0, 0, 200, 200)).(*image.YCbCr) //图片裁剪x0 y0 x1 y1


	//img -> file
	f, _ := os.Create("test.jpg")     //创建文件
	defer f.Close()                   		//关闭文件
	jpeg.Encode(f, subImg, nil)       	//写入文件

	//img -> base64
	emptyBuff := bytes.NewBuffer(nil)                  //开辟一个新的空buff
	jpeg.Encode(emptyBuff, subImg, nil)                //img写入到buff
	dist := make([]byte, 50000)                        //开辟存储空间
	base64.StdEncoding.Encode(dist, emptyBuff.Bytes()) //buff转成base64
	fmt.Println(string(dist))                          //输出图片base64(type = []byte)
	_ = ioutil.WriteFile("./base64pic.txt", dist, 0666) //buffer输出到jpg文件中(不做处理,直接写到文件)

	//imgFile -> base64
	ff, _ := ioutil.ReadFile("output2.jpg")               //我还是喜欢用这个快速读文件
	bufstore := make([]byte, 5000000)                     //数据缓存
	base64.StdEncoding.Encode(bufstore, ff)               // 文件转base64
	_ = ioutil.WriteFile("./output2.jpg.txt", dist, 0666) //直接写入到文件就ok完活了。
}
### 回答1: VB6.0中可以实现图片与base64格式的相互转换。 将图片转换base64格式,可以先将图片读入到程序中,再使用Base64编码将其转换为字符串形式。具体实现如下: 1. 首先需要引用Microsoft ActiveX Data Objects库,即在工具栏菜单-项目-引用中勾选“Microsoft ActiveX Data Objects X.X Library”。 2. 读取图片到程序中,可以使用FileSystemObject对象的OpenTextFile方法实现。代码如下: Dim fs As Object Dim f As Object Dim s As String Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.OpenTextFile("C:\test.jpg", 1) '1表示只读模式 s = f.ReadAll f.Close 3. 将读取到的图片数据进行Base64编码处理,可以使用Microsoft.XMLDOM对象的transformNodeToObject方法,代码如下: Dim xmlDoc As Object Dim objNode As Object Dim outStream As Object Set xmlDoc = CreateObject("MSXML2.DOMDocument") Set objNode = xmlDoc.createElement("myNode") objNode.DataType = "bin.base64" objNode.nodeTypedValue = Stream_ImageRead("C:\test.jpg") '将读取到的图片数据传递进去 xmlDoc.appendChild objNode Set outStream = CreateObject("ADODB.Stream") outStream.Type = adTypeText outStream.Charset = "utf-8" outStream.Open xmlDoc.transformNodeToObject objNode, outStream s = outStream.ReadText outStream.Close 4. 最终得到的s就是图片的base64编码字符串。 将base64格式的字符串转换为图片,可以使用ADODB.Stream对象的LoadFromFile方法将base64字符串转换为二进制数据,再使用SaveToFile方法将二进制数据保存为图片文件。代码如下: Dim objStream As Object Set objStream = CreateObject("ADODB.Stream") objStream.Type = adTypeBinary objStream.Open objStream.Write Replace(s, "data:image/jpeg;base64,", "") '将base64字符串中的头部去掉 objStream.SaveToFile "C:\test.jpg", adSaveCreateOverWrite objStream.Close 以上就是VB6.0中图片与base64格式的相互转换实现的方法。 ### 回答2: 在VB6.0中,需要将图片转换Base64编码格式时,可以使用以下步骤: 1. 将图片文件打开并读取到内存中,使用FilesystemObject对象来处理文件操作。 2. 使用ADODB.Stream对象将图片读取到二进制(Byte)数组中。 3. 将二进制数组转换Base64编码格式,可以使用MSXML2.DOMDocument对象来进行编码处理。 4. 将Base64编码后的字符串输出或者存储到需要的地方。 以下是一个VB6.0示例代码: ``` '打开图片文件 Dim fs As New FileSystemObject Dim fso As File Set fso = fs.GetFile("C:\test.jpg") '将图片文件读取到二进制数组中 Dim stream As New ADODB.Stream stream.Type = adTypeBinary stream.Open stream.LoadFromFile fso.Path Dim buffer() As Byte ReDim buffer(stream.Size - 1) stream.Read buffer '将二进制转换Base64编码 Dim dom As New MSXML2.DOMDocument Dim elemBin As IXMLDOMElement Dim elemText As IXMLDOMText Set elemBin = dom.createElement("bin") elemBin.DataType = "bin.base64" elemBin.nodeTypedValue = buffer Set elemText = dom.createTextNode(elemBin.Text) Dim base64Str As String base64Str = elemText.Text '输出Base64字符串 MsgBox base64Str ``` 这个过程需要注意的是:大文件不能一次全部读入内存中,需要采用流方式处理。另外,还需要注意编码格式、块处理、格式化等问题。 ### 回答3: VB6.0是一种广泛应用于Windows平台上的编程语言,它可以轻松实现图片与base64的相互转换Base64是一种将二进制数据编码成ASCII字符的方法,通常用于在网络中传输图片、音频等二进制数据。在VB6.0中,可以通过以下方式将图片转换base64编码: 1.将图片读取为二进制数据: Dim b() As Byte Open "C:\image.jpg" For Binary As #1 ReDim b(LOF(1) - 1) Get #1, , b Close #1 2.使用Microsoft.XMLDOM对象来生成base64编码: Dim xmlDoc As Object Set xmlDoc = CreateObject("Microsoft.XMLDOM") xmlDoc.LoadXML "<root/>" xmlDoc.DocumentElement.DataType = "bin.base64" xmlDoc.DocumentElement.NodeTypedValue = b Base64String = xmlDoc.DocumentElement.Text 如果想要将已经编码为base64的数据转换回原始图片数据,也可以通过以下方式实现: 1.将base64字符串转换为二进制数据: Dim b() As Byte b = StrConv(Base64String, vbFromUnicode) b = DecodeBase64(b) 其中,DecodeBase64是一个自定义函数,用于将base64字符串解码为二进制数据。 2.将二进制数据保存为图片文件: Open "C:\image.jpg" For Binary As #1 Put #1, , b Close #1 综上所述,通过VB6.0可以轻松地实现图片与base64的相互转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值