89 lines
2.1 KiB
Go
89 lines
2.1 KiB
Go
package gozxing
|
|
|
|
import (
|
|
"image"
|
|
|
|
errors "golang.org/x/xerrors"
|
|
)
|
|
|
|
func NewBinaryBitmapFromImage(img image.Image) (*BinaryBitmap, error) {
|
|
src := NewLuminanceSourceFromImage(img)
|
|
return NewBinaryBitmap(NewHybridBinarizer(src))
|
|
}
|
|
|
|
type GoImageLuminanceSource struct {
|
|
*RGBLuminanceSource
|
|
}
|
|
|
|
func NewLuminanceSourceFromImage(img image.Image) LuminanceSource {
|
|
rect := img.Bounds()
|
|
width := rect.Max.X - rect.Min.X
|
|
height := rect.Max.Y - rect.Min.Y
|
|
|
|
luminance := make([]byte, width*height)
|
|
index := 0
|
|
for y := rect.Min.Y; y < rect.Max.Y; y++ {
|
|
for x := rect.Min.X; x < rect.Max.X; x++ {
|
|
r, g, b, a := img.At(x, y).RGBA()
|
|
lum := (r + 2*g + b) * 255 / (4 * 0xffff)
|
|
luminance[index] = byte((lum*a + (0xffff-a)*255) / 0xffff)
|
|
index++
|
|
}
|
|
}
|
|
|
|
return &GoImageLuminanceSource{&RGBLuminanceSource{
|
|
LuminanceSourceBase{width, height},
|
|
luminance,
|
|
width,
|
|
height,
|
|
0,
|
|
0,
|
|
}}
|
|
}
|
|
|
|
func (this *GoImageLuminanceSource) Crop(left, top, width, height int) (LuminanceSource, error) {
|
|
cropped, e := this.RGBLuminanceSource.Crop(left, top, width, height)
|
|
if e != nil {
|
|
return nil, e
|
|
}
|
|
return &GoImageLuminanceSource{cropped.(*RGBLuminanceSource)}, nil
|
|
}
|
|
|
|
func (this *GoImageLuminanceSource) Invert() LuminanceSource {
|
|
return LuminanceSourceInvert(this)
|
|
}
|
|
|
|
func (this *GoImageLuminanceSource) IsRotateSupported() bool {
|
|
return true
|
|
}
|
|
|
|
func (this *GoImageLuminanceSource) RotateCounterClockwise() (LuminanceSource, error) {
|
|
width := this.GetWidth()
|
|
height := this.GetHeight()
|
|
top := this.top
|
|
left := this.left
|
|
dataWidth := this.dataWidth
|
|
oldLuminas := this.RGBLuminanceSource.luminances
|
|
newLuminas := make([]byte, width*height)
|
|
|
|
for j := 0; j < width; j++ {
|
|
x := left + width - 1 - j
|
|
for i := 0; i < height; i++ {
|
|
y := top + i
|
|
newLuminas[j*height+i] = oldLuminas[y*dataWidth+x]
|
|
}
|
|
}
|
|
return &GoImageLuminanceSource{&RGBLuminanceSource{
|
|
LuminanceSourceBase{height, width},
|
|
newLuminas,
|
|
height,
|
|
width,
|
|
0,
|
|
0,
|
|
}}, nil
|
|
}
|
|
|
|
func (this *GoImageLuminanceSource) RotateCounterClockwise45() (LuminanceSource, error) {
|
|
return nil, errors.New("RotateCounterClockwise45 is not implemented")
|
|
}
|