国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

昆山做網(wǎng)站哪家好百度競(jìng)價(jià)排名廣告定價(jià)鮮花

昆山做網(wǎng)站哪家好,百度競(jìng)價(jià)排名廣告定價(jià)鮮花,做網(wǎng)站的好項(xiàng)目,東莞企業(yè)免費(fèi)建站加水印應(yīng)該是個(gè)很常見(jiàn)的需求,但是網(wǎng)上找的代碼,都感覺(jué)不太完善。記錄下自己搞出來(lái)的一個(gè)方案 水印有幾個(gè)需求: 中文文字水印文字傾斜滿圖都是,而不是只有一個(gè)地方水印文字所在之處完全展示水印 實(shí)現(xiàn)思路 準(zhǔn)備水印圖 我是這么…

加水印應(yīng)該是個(gè)很常見(jiàn)的需求,但是網(wǎng)上找的代碼,都感覺(jué)不太完善。記錄下自己搞出來(lái)的一個(gè)方案

水印有幾個(gè)需求:

  1. 中文文字水印
  2. 文字傾斜
  3. 滿圖都是,而不是只有一個(gè)地方
  4. 水印文字所在之處完全展示水印

實(shí)現(xiàn)思路

準(zhǔn)備水印圖

我是這么做的,先手工生成一張水印圖,尺寸比較小,約100*100。然后也把文字旋轉(zhuǎn)一定角度(當(dāng)然如果想做隨機(jī)角度,也是可以的,代碼再?gòu)?fù)雜點(diǎn)處理就好,不影響這個(gè)思路),生成這個(gè)一張圖片,并且底色選擇純黑

然后用opencv將水印圖處理出一張二值圖

這個(gè)也不難,底色純黑,這個(gè)很好做,用Threshold很容易實(shí)現(xiàn)。

然后用水印圖和原圖疊加

核心就是要用copyTo(),然后要輸入mask,二值圖的作用就是做掩碼,這樣就可以實(shí)現(xiàn)完美的水印添加效果。

其他細(xì)節(jié)

因?yàn)樗D通常是遠(yuǎn)小于原圖的(其實(shí)也可以采用其他方案。總之核心就是要有水印圖和對(duì)應(yīng)的二值圖),如何實(shí)現(xiàn)滿圖添加水印呢?

思路

  1. 先設(shè)置一個(gè)水印的間距,比如兩百個(gè)像素點(diǎn)
  2. 然后通過(guò)水印圖的大小和間距的值,計(jì)算生成一個(gè)尺寸大于等于原圖的純水印圖(同時(shí)也要有二值圖)
  3. 然后裁剪成和原圖一樣大
  4. 然后用copyTo()疊加即可。

這樣性能很高,go語(yǔ)言實(shí)現(xiàn)處理一張圖片不超過(guò)10ms。

go語(yǔ)言實(shí)現(xiàn)

思路都是通用的,基于opencv都能實(shí)現(xiàn)。


func ImgWatermark(img gocv.Mat) {var Watermark gocv.Matvar WatermarkBW gocv.Mat// 不同通道的圖片使用不同的水印if img.Channels() == 3 {// 判斷是否需要初始化if g.Watermark3 == nil { // g. 是我設(shè)置的全局變量,因?yàn)椴恍枰看味技虞d水印。加載一次到內(nèi)存即可mat := gocv.IMRead(`watermark.jpg`, gocv.IMReadColor)g.Watermark3 = &mat// 取得水印圖片的二值圖watermarkGray3 := gocv.NewMat()gocv.CvtColor(*g.Watermark3, &watermarkGray3, gocv.ColorBGRToGray)// 取得二值圖的黑白圖BW3 := gocv.NewMat()g.WatermarkBW3 = &BW3gocv.Threshold(watermarkGray3, g.WatermarkBW3, 30, 255, gocv.ThresholdBinary)watermarkGray3.Close()}Watermark = *g.Watermark3WatermarkBW = *g.WatermarkBW3} else if img.Channels() == 4 {// 判斷是否需要初始化if g.Watermark4 == nil {mat := gocv.IMRead(`watermark.jpg`, gocv.IMReadColor)g.Watermark4 = &matgocv.Merge([]gocv.Mat{mat, gocv.NewMatWithSizeFromScalar(gocv.NewScalar(255, 255, 255, 255), mat.Rows(), mat.Cols(), gocv.MatTypeCV8UC1)}, g.Watermark4)// 取得水印圖片的二值圖watermarkGray4 := gocv.NewMat()gocv.CvtColor(*g.Watermark4, &watermarkGray4, gocv.ColorBGRToGray)// 取得二值圖的黑白圖BW4 := gocv.NewMat()g.WatermarkBW4 = &BW4gocv.Threshold(watermarkGray4, g.WatermarkBW4, 30, 255, gocv.ThresholdBinary)watermarkGray4.Close()}Watermark = *g.Watermark4WatermarkBW = *g.WatermarkBW4} else if img.Channels() == 1 {// 判斷是否需要初始化if g.Watermark1 == nil {mat := gocv.IMRead(`watermark.jpg`, gocv.IMReadGrayScale) // 直接讀取黑白g.Watermark1 = &mat// 取得二值圖的黑白圖BW1 := gocv.NewMat()g.WatermarkBW1 = &BW1gocv.Threshold(mat, g.WatermarkBW1, 30, 255, gocv.ThresholdBinary)}Watermark = *g.Watermark1WatermarkBW = *g.WatermarkBW1} else {fmt.Println("圖片通道數(shù)不支持", img.Channels())return}waterCol := Watermark.Cols()waterRow := Watermark.Rows()// 為了水印不要那么密,這里設(shè)置一個(gè)間距spacing := 200 // 水印的間距waterColAndSpacing := waterCol + spacingwatreRowAndSpacing := waterRow + spacing// 計(jì)算需要添加水印的次數(shù)watermarkHugeRowTimes := int(math.Ceil(float64(img.Rows()) / float64(watreRowAndSpacing))) //向上取整watermarkHugeColTimes := int(math.Ceil(float64(img.Cols()) / float64(waterColAndSpacing)))imgRect := image.Rectangle{} //每次取圖像中哪一塊區(qū)域的數(shù)據(jù)結(jié)構(gòu)var croppedMat gocv.Mat      // 每次從原圖像上裁剪和水印圖像一樣大小的一塊newWater := WatermarknewWaterBW := WatermarkBW// 循環(huán)一塊塊的給圖像添加水印for i := 0; i < watermarkHugeColTimes; i++ {imgRect.Min.X = i * waterColAndSpacingimgRect.Max.X = imgRect.Min.X + waterColif imgRect.Max.X >= img.Cols() { // 判斷是否超出原圖像的列數(shù)imgRect.Max.X = img.Cols()}for j := 0; j < watermarkHugeRowTimes; j++ {imgRect.Min.Y = j * watreRowAndSpacingimgRect.Max.Y = imgRect.Min.Y + waterRowif imgRect.Max.Y >= img.Rows() { // 判斷是否超出原圖像的行數(shù)imgRect.Max.Y = img.Rows()}croppedMat = img.Region(imgRect) // 原圖像中一塊區(qū)域的淺拷貝,修改它會(huì)連帶修改原圖像// 判斷裁剪的圖像大小是否與水印圖像大小一致,不一致則需要重新裁剪if croppedMat.Rows() != Watermark.Rows() || croppedMat.Cols() != Watermark.Cols() {newRect := image.Rectangle{Min: image.Point{X: 0, Y: 0}, Max: image.Point{X: croppedMat.Cols(), Y: croppedMat.Rows()}}newWater = Watermark.Region(newRect)newWaterBW = WatermarkBW.Region(newRect)}newWater.CopyToWithMask(&croppedMat, newWaterBW) // 用水印圖覆蓋原圖像}}
}
http://m.aloenet.com.cn/news/28924.html

相關(guān)文章:

  • 做網(wǎng)站用什么軟件知乎google瀏覽器下載
  • 企業(yè)做定制網(wǎng)站的好處自助建站免費(fèi)建站平臺(tái)
  • 網(wǎng)站出現(xiàn)的的問(wèn)題軟文營(yíng)銷(xiāo)案例
  • 泰安網(wǎng)站制作seo海外
  • 做電池的外貿(mào)網(wǎng)站廣州日新增51萬(wàn)人
  • 哪個(gè)網(wǎng)站不花錢(qián)可以做招聘互聯(lián)網(wǎng)營(yíng)銷(xiāo)的特點(diǎn)
  • wordpress下載器插件廣東seo價(jià)格是多少錢(qián)
  • 網(wǎng)站建設(shè) 日志免費(fèi)外鏈網(wǎng)
  • 做網(wǎng)站可以在哪兒接活app推廣拉新接單平臺(tái)
  • 梅州專(zhuān)業(yè)網(wǎng)站建設(shè)教程高端品牌網(wǎng)站建設(shè)
  • flash網(wǎng)站的優(yōu)勢(shì)廈門(mén)谷歌seo公司
  • 自己做的網(wǎng)站怎么弄成app中國(guó)聯(lián)通騰訊
  • 企業(yè)營(yíng)銷(xiāo)網(wǎng)站福建網(wǎng)絡(luò)seo關(guān)鍵詞優(yōu)化教程
  • 網(wǎng)站頁(yè)面的滑動(dòng)怎么做現(xiàn)代營(yíng)銷(xiāo)手段有哪些
  • 購(gòu)物網(wǎng)站補(bǔ)貨提醒軟件怎么做重慶網(wǎng)站seo診斷
  • app開(kāi)發(fā)企業(yè)網(wǎng)站建設(shè)seo專(zhuān)員是什么意思
  • 如何設(shè)置網(wǎng)站的默認(rèn)頁(yè)網(wǎng)站模板哪里好
  • 沈陽(yáng)手機(jī)網(wǎng)站制作seo課程培訓(xùn)視頻
  • 房產(chǎn)網(wǎng)站開(kāi)發(fā)功能報(bào)價(jià)合肥百度關(guān)鍵詞推廣
  • 網(wǎng)站建設(shè)功能需求廣告投放價(jià)目表
  • 申請(qǐng)域名需要多久seo鏈接優(yōu)化建議
  • wordpress評(píng)論調(diào)用標(biāo)簽常德seo公司
  • 西鄉(xiāng)做網(wǎng)站刷贊業(yè)務(wù)推廣網(wǎng)站
  • 網(wǎng)站 租用服務(wù)器價(jià)格網(wǎng)店運(yùn)營(yíng)是做什么的
  • 青島市網(wǎng)站建設(shè)公司技能培訓(xùn)班有哪些
  • facebook做網(wǎng)站推廣批量?jī)?yōu)化網(wǎng)站軟件
  • vba可以做網(wǎng)站自動(dòng)填海外廣告投放公司
  • 進(jìn)入網(wǎng)站服務(wù)器怎么做推廣有什么好方法
  • 電子商務(wù)seo是指什么意思seo是哪個(gè)英文的簡(jiǎn)寫(xiě)
  • 網(wǎng)絡(luò)推廣網(wǎng)站怎么做網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn)學(xué)校