From 391725d3791a8771c907eb7e306a92ae66cb7d09 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sat, 12 Sep 2026 03:33:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=86=85=E5=AD=98=E5=8D=A0=E7=94=A8):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=92=99=E7=89=88=E5=A4=84=E7=90=86=E6=80=A7?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=87=8F=E5=B0=91=E5=86=85=E5=AD=98=E5=88=86?= =?UTF-8?q?=E9=85=8D=EF=BC=8C=E4=BF=9D=E6=8C=81=E6=B8=B2=E6=9F=93=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_renderer_image.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/ofdgo_renderer_image.go b/ofdgo_renderer_image.go index 9b5db40..8a89827 100644 --- a/ofdgo_renderer_image.go +++ b/ofdgo_renderer_image.go @@ -144,7 +144,7 @@ func imageWithMask(img, mask image.Image) image.Image { for x := bounds.Min.X; x < bounds.Max.X; x++ { mx := maskBounds.Min.X + x - bounds.Min.X my := maskBounds.Min.Y + y - bounds.Min.Y - a := color.GrayModel.Convert(opacity.At(mx, my)).(color.Gray).Y + a := imageGrayAt(opacity, mx, my).Y c := imageNRGBAAt(source, x, y) c.A = uint8(int(c.A) * int(a) / 255) out.SetNRGBA(x, y, c) @@ -394,6 +394,23 @@ func imagePixelSource(img image.Image) image.Image { return img } +// imageGrayAt 获取图片灰度像素 +// 入参: img 图片对象, x X坐标, y Y坐标 +// 返回: color.Gray 灰度像素 +func imageGrayAt(img image.Image, x, y int) color.Gray { + if src, ok := img.(*image.Gray); ok { + return src.GrayAt(x, y) + } + if src, ok := img.(*image.Paletted); ok { + return color.GrayModel.Convert(src.At(x, y)).(color.Gray) + } + if src, ok := img.(image.RGBA64Image); ok { + r, g, b, _ := src.RGBA64At(x, y).RGBA() + return color.Gray{Y: uint8((19595*r + 38470*g + 7471*b + 1<<15) >> 24)} + } + return color.GrayModel.Convert(img.At(x, y)).(color.Gray) +} + // imageNRGBAAt 获取图片NRGBA像素 // 入参: img 图片对象, x X坐标, y Y坐标 // 返回: color.NRGBA NRGBA像素