Android开发秘籍:给图片加上独特水印

news2026/4/3 19:26:19
Android开发秘籍给图片加上独特水印为什么要给图片加水印在当今这个信息飞速传播的时代图片作为一种直观且富有表现力的信息载体在我们的生活和工作中无处不在。无论是在社交媒体上分享的精美摄影作品还是电商平台上展示的商品图片亦或是新闻媒体发布的报道配图图片的使用频率都极高。但这也带来了一个严峻的问题 —— 图片的版权保护和信息标识变得愈发重要。对于摄影师而言他们精心创作的摄影作品是其心血的结晶。然而一旦这些作品在网络上传播就很容易被他人未经授权地使用甚至被恶意篡改。此时添加水印就成为了一种有效的版权保护手段。通过在图片上添加包含摄影师个人信息、作品创作时间等内容的水印其他人在使用图片时就会有所顾忌因为水印明确地标识了图片的归属权。这就好比在自己的 “数字领地” 插上了一面旗帜宣告着对这片 “领地” 的主权。在商业领域图片的传播更是广泛。企业为了推广自己的产品或服务会在各种宣传渠道上使用大量的图片。这些图片不仅代表着企业的形象还承载着重要的商业信息。为了防止竞争对手盗用图片或者确保图片在传播过程中始终与企业品牌紧密相连企业通常会在图片上添加带有企业标识、网址等信息的水印。这样一来无论图片出现在哪里都能起到品牌推广和信息传递的作用就像一个移动的广告位时刻提醒着观众图片背后的商业主体。再比如在一些新闻报道中为了防止图片被不法分子利用来传播虚假信息新闻媒体也会给图片添加水印注明来源和发布时间。这不仅有助于维护新闻的真实性和权威性还能在一定程度上追溯图片的传播路径为后续的信息核实提供依据。既然水印在生活和工作中有如此重要的作用那么在 Android 开发中实现图片加水印的功能也就显得尤为必要。无论是开发一款图片编辑应用还是在社交类、电商类等应用中处理用户上传或展示的图片具备添加水印的能力都能让应用更加完善和实用满足用户对于图片版权保护和信息标识的需求。准备工作开发环境搭建在开始实现图片加水印功能之前我们首先得确保开发环境已经搭建好。如果你还没有安装 Android 开发工具那么强烈推荐你使用 Android Studio这可是官方力荐的集成开发环境功能超强大能让你的开发过程如虎添翼。你可以前往Android Studio 官网下载最新版本。安装完成后打开 Android Studio创建一个新的 Android 项目。在创建项目的过程中你可以按照向导的提示一步一步地进行设置比如填写项目名称、包名选择项目的存储路径设定支持的最低 Android 版本和目标运行版本选择应用的主题样式设置主 Activity 的名称、对应的布局文件XML名称以及启动界面的布局模板等。这些设置都非常重要它们将决定你的项目的基本框架和运行环境。所需依赖库为了更高效地加载图片我们这里选用 Glide 库它可是 Google 钦点推荐的在图片加载界那可是相当厉害。它的优势相当明显拥有超智能的图片缓存机制磁盘缓存和内存缓存双管齐下能大大减少图片加载时间还能降低内存和存储空间的消耗可以自动处理图片加载过程中的各种状态比如加载中、加载失败或者显示图片占位符让用户体验超棒而且它还能自动处理不同尺寸的图片加载问题按需加载避免不必要的内存浪费简直就是内存管理小能手。要在项目中使用 Glide 库需要在项目的 build.gradle 文件中添加依赖。打开 app 目录下的 build.gradle 文件在 dependencies 闭包中添加以下代码implementationcom.github.bumptech.glide:glide:4.15.1annotationProcessorcom.github.bumptech.glide:compiler:4.15.1添加完依赖后记得点击 Sync Now 按钮让 Gradle 同步项目下载并集成 Glide 库。这样我们就为实现图片加水印功能做好了充分的准备。实战文字水印添加创建添加水印函数接下来我们就正式开始实现添加文字水印的功能。在 Kotlin 中我们可以创建一个扩展函数来为Bitmap图像添加水印。代码如下funBitmap.addWatermark(watermarkText:String):Bitmap{// 创建一个用于绘制水印的画笔valwatermarkPaintPaint().apply{// 设置水印颜色为白色colorColor.WHITE// 设置水印透明度为150取值范围是0 - 2550为完全透明255为不透明alpha150// 设置水印文字大小为50sptextSizeTypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,50f,resources.displayMetrics)// 设置画笔的填充样式stylePaint.Style.FILL// 设置抗锯齿使文字边缘更平滑isAntiAliastrue}// 创建一个新的Bitmap大小与原始Bitmap相同用于保存添加水印后的图像valresultBitmapBitmap.createBitmap(width,height,config)// 创建一个Canvas用于在新的Bitmap上绘制图像和水印valcanvasCanvas(resultBitmap)// 将原始Bitmap绘制到Canvas上起始坐标为(0, 0)canvas.drawBitmap(this,0f,0f,null)// 计算水印文字的宽度valtextWidthwatermarkPaint.measureText(watermarkText)// 计算水印文字的高度valfontMetricswatermarkPaint.fontMetricsvaltextHeightfontMetrics.bottom-fontMetrics.top// 在Canvas上绘制水印文字位置在右下角并且有一定的边距canvas.drawText(watermarkText,width-textWidth-20f,height-textHeight-20f,watermarkPaint)returnresultBitmap}在这段代码中我们首先创建了一个Paint对象watermarkPaint并对其进行了一系列的设置。color属性用于设置水印的颜色这里我们选择了白色就像在一张白纸上用白色的笔写字一样虽然颜色相同但仔细看还是能发现痕迹这就是水印的巧妙之处。alpha属性设置了水印的透明度150 的透明度使得水印既不会过于显眼影响图片的整体美观又能有效地起到标识作用就像一层淡淡的薄纱覆盖在图片上。textSize属性设置了水印文字的大小通过TypedValue.applyDimension方法将50sp的大小转换为实际的像素值这样可以保证在不同分辨率的设备上水印文字的大小看起来都比较合适不会出现过大或过小的情况。style属性设置为Paint.Style.FILL表示画笔的填充样式就像我们用彩笔涂满一个图形一样这里是将水印文字填充为我们设置的颜色。isAntiAlias属性设置为true用于开启抗锯齿功能这样绘制出来的文字边缘会更加平滑不会出现锯齿状让水印看起来更加精致。然后我们使用Bitmap.createBitmap方法创建了一个新的Bitmap对象resultBitmap它的大小和原始Bitmap相同并且具有相同的配置。这个新的Bitmap就像是一张空白的画布等待我们在上面绘制内容。接着我们创建了一个Canvas对象canvas并将新创建的Bitmap传递给它这样canvas就可以在resultBitmap上进行绘制操作了。之后我们使用canvas.drawBitmap方法将原始Bitmap绘制到Canvas上起始坐标为(0, 0)也就是从画布的左上角开始绘制这样原始图片就被完整地呈现在了新的画布上。为了确定水印文字的绘制位置我们先计算了水印文字的宽度和高度。通过watermarkPaint.measureText方法可以获取水印文字的宽度就像我们用尺子测量一段线段的长度一样。而水印文字的高度则通过watermarkPaint.fontMetrics来获取fontMetrics包含了字体的各种度量信息我们通过fontMetrics.bottom - fontMetrics.top计算出文字的高度。最后使用canvas.drawText方法在Canvas上绘制水印文字位置在右下角并且有20f的边距这样可以避免水印文字紧贴着图片边缘看起来更加美观。界面展示与交互实现有了添加水印的函数后我们还需要一个界面来展示图片和触发添加水印的操作。下面是一个简单的 XML 布局文件用于创建一个包含图片显示区域和添加水印按钮的界面?xml version1.0 encodingutf-8?RelativeLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentImageViewandroid:idid/imageViewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent/Buttonandroid:idid/addWatermarkButtonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text添加水印android:layout_alignParentBottomtrueandroid:layout_centerHorizontaltrue//RelativeLayout在这个布局文件中我们使用了RelativeLayout作为根布局它可以让子视图根据相对位置进行排列。ImageView用于显示图片它的宽度和高度都设置为match_parent这样图片就会充满整个屏幕让用户能够清晰地看到图片的细节。Button用于触发添加水印的操作它的宽度和高度设置为wrap_content根据按钮上的文字自动调整大小显示更加自然。android:text属性设置了按钮上显示的文字为 “添加水印”简洁明了地告诉用户这个按钮的功能。android:layout_alignParentBottomtrue表示按钮位于父布局的底部android:layout_centerHorizontaltrue表示按钮在水平方向上居中这样的布局方式符合用户的操作习惯方便用户找到并点击按钮。接下来在MainActivity中加载原始图片并设置按钮的点击事件来调用添加水印的函数更新显示图片classMainActivity:AppCompatActivity(){privatelateinitvarimageView:ImageViewoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)imageViewfindViewById(R.id.imageView)// 从资源文件中加载原始图片valoriginalBitmapBitmapFactory.decodeResource(resources,R.drawable.sample_image)imageView.setImageBitmap(originalBitmap)findViewByIdButton(R.id.addWatermarkButton).setOnClickListener{// 调用addWatermark函数为原始图片添加水印valwatermarkedBitmaporiginalBitmap.addWatermark(版权所有)imageView.setImageBitmap(watermarkedBitmap)}}}在MainActivity的onCreate方法中我们首先通过findViewById方法获取到布局文件中的ImageView和Button。然后使用BitmapFactory.decodeResource方法从资源文件中加载原始图片这里的R.drawable.sample_image是图片资源的引用你需要将其替换为你自己的图片资源。加载完原始图片后通过imageView.setImageBitmap方法将原始图片显示在ImageView上这样用户在打开应用时就能看到原始图片。当用户点击 “添加水印” 按钮时会触发按钮的点击事件。在点击事件的回调函数中我们调用之前定义的addWatermark函数为原始图片添加水印水印内容为 “版权所有”。添加水印后得到一个新的Bitmap对象watermarkedBitmap再通过imageView.setImageBitmap方法将添加水印后的图片显示在ImageView上这样用户就能看到添加水印后的效果了。通过这样的界面展示与交互实现用户可以方便地对图片进行水印添加操作体验到我们应用的便捷性和实用性。进阶图片水印添加准备水印图片当我们想要给图片添加图片水印时首先得准备好用于水印的图片。这张图片可以是公司的 logo或者是你自己设计的独特标识。将准备好的水印图片放置在项目的 res/drawable 目录下这样在代码中就能方便地引用它。就好比我们要在一本书上贴上自己的专属标签首先得准备好这个标签然后把它放在一个容易找到的地方方便随时取用。实现添加图片水印的逻辑接下来我们通过代码来实现添加图片水印的功能。这里我们给出 Java 和 Kotlin 两种语言的代码示例方便大家根据自己的喜好和项目需求进行选择。Java 代码示例importandroid.graphics.Bitmap;importandroid.graphics.Canvas;importandroid.graphics.Paint;publicclassWatermarkUtil{publicstaticBitmapaddImageWatermark(Bitmapsrc,Bitmapwatermark){intsrcWidthsrc.getWidth();intsrcHeightsrc.getHeight();intwatermarkWidthwatermark.getWidth();intwatermarkHeightwatermark.getHeight();// 创建一个新的Bitmap大小与原图相同BitmapresultBitmap.createBitmap(srcWidth,srcHeight,Bitmap.Config.ARGB_8888);CanvascanvasnewCanvas(result);// 将原图绘制到新的Bitmap上canvas.drawBitmap(src,0,0,null);// 将水印绘制到右下角并且设置一定的边距intpadding20;canvas.drawBitmap(watermark,srcWidth-watermarkWidth-padding,srcHeight-watermarkHeight-padding,null);returnresult;}}在这段 Java 代码中我们首先获取了原始图片src的宽度srcWidth和高度srcHeight以及水印图片watermark的宽度watermarkWidth和高度watermarkHeight。然后使用Bitmap.createBitmap方法创建了一个新的Bitmap对象result它的大小和原始图片相同并且配置为Bitmap.Config.ARGB_8888这种配置可以支持透明度让水印与原始图片融合得更加自然。接着创建了一个Canvas对象canvas并将新创建的Bitmap传递给它这样canvas就可以在result上进行绘制操作了。之后使用canvas.drawBitmap方法将原始图片绘制到Canvas上起始坐标为(0, 0)也就是从画布的左上角开始绘制这样原始图片就被完整地呈现在了新的画布上。最后为了将水印图片绘制到原始图片的右下角并且设置了20像素的边距我们再次使用canvas.drawBitmap方法将水印图片绘制到指定的位置这样就完成了图片水印的添加。Kotlin 代码示例importandroid.graphics.Bitmapimportandroid.graphics.Canvasimportandroid.graphics.PaintfunBitmap.addImageWatermark(watermark:Bitmap):Bitmap{valsrcWidthwidthvalsrcHeightheightvalwatermarkWidthwatermark.widthvalwatermarkHeightwatermark.height// 创建一个新的Bitmap大小与原图相同valresultBitmap.createBitmap(srcWidth,srcHeight,config)valcanvasCanvas(result)// 将原图绘制到新的Bitmap上canvas.drawBitmap(this,0f,0f,null)// 将水印绘制到右下角并且设置一定的边距valpadding20canvas.drawBitmap(watermark,srcWidth-watermarkWidth-padding.toFloat(),srcHeight-watermarkHeight-padding.toFloat(),null)returnresult}Kotlin 代码的逻辑与 Java 代码类似首先获取原始图片和水印图片的宽高然后创建一个与原始图片大小相同的新Bitmap对象result并基于这个Bitmap创建Canvas对象canvas。接着将原始图片绘制到Canvas上最后将水印图片绘制到原始图片的右下角并设置了20像素的边距。这里需要注意的是Kotlin 中函数扩展的使用通过扩展函数addImageWatermark我们可以直接在Bitmap对象上调用这个函数来添加图片水印使得代码更加简洁和易读就像给Bitmap对象赋予了一个新的能力让它能够自己给自己添加水印。在实际使用中你可以这样调用上述代码classMainActivity:AppCompatActivity(){privatelateinitvarimageView:ImageViewoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)imageViewfindViewById(R.id.imageView)// 从资源文件中加载原始图片valoriginalBitmapBitmapFactory.decodeResource(resources,R.drawable.sample_image)// 从资源文件中加载水印图片valwatermarkBitmapBitmapFactory.decodeResource(resources,R.drawable.watermark)// 调用addImageWatermark函数为原始图片添加图片水印valwatermarkedBitmaporiginalBitmap.addImageWatermark(watermarkBitmap)imageView.setImageBitmap(watermarkedBitmap)}}在MainActivity的onCreate方法中我们首先获取到布局文件中的ImageView。然后通过BitmapFactory.decodeResource方法从资源文件中分别加载原始图片和水印图片。接着调用addImageWatermark函数为原始图片添加图片水印得到一个新的Bitmap对象watermarkedBitmap。最后通过imageView.setImageBitmap方法将添加水印后的图片显示在ImageView上这样用户就能看到添加了图片水印的效果了。通过这样的代码实现我们就成功地在 Android 应用中实现了添加图片水印的功能满足了用户对于图片版权保护和个性化定制的需求。优化与拓展处理不同尺寸和分辨率的图片在实际应用中我们会遇到各种各样尺寸和分辨率的图片。如果直接使用固定的水印位置和大小可能会导致水印在某些图片上显示效果不佳比如水印过大遮挡了图片的重要内容或者水印过小难以辨认。为了解决这个问题我们可以根据图片的大小动态调整水印的位置和大小。例如我们可以按照图片宽度的一定比例来设置水印的大小这样无论图片是大是小水印都能保持相对合适的尺寸。在 Kotlin 中我们可以这样实现funBitmap.addWatermark(watermarkText:String):Bitmap{valwatermarkPaintPaint().apply{// 这里根据图片宽度的1/20来设置水印文字大小可根据实际需求调整比例textSizewidth/20fcolorColor.WHITE alpha150stylePaint.Style.FILL isAntiAliastrue}valresultBitmapBitmap.createBitmap(width,height,config)valcanvasCanvas(resultBitmap)canvas.drawBitmap(this,0f,0f,null)valtextWidthwatermarkPaint.measureText(watermarkText)valfontMetricswatermarkPaint.fontMetricsvaltextHeightfontMetrics.bottom-fontMetrics.top// 根据图片宽度和高度的一定比例来确定水印的位置这里是右下角可根据需求调整canvas.drawText(watermarkText,width*0.9f-textWidth,height*0.9f-textHeight,watermarkPaint)returnresultBitmap}在这段代码中textSize width / 20f根据图片宽度的 1/20 来动态设置水印文字大小。在绘制水印文字时width * 0.9f - textWidth和height * 0.9f - textHeight根据图片宽度和高度的 90% 来确定水印文字在右下角的位置并且减去了水印文字的宽度和高度以确保水印不会超出图片边界。这样当处理不同尺寸和分辨率的图片时水印的大小和位置都能自适应调整保证了水印在各种图片上都能有较好的显示效果。提升水印的美观度和安全性水印的美观度对于用户体验和图片的整体效果至关重要。在选择水印字体时我们要考虑字体的风格是否与图片的主题相匹配。比如如果是一张时尚的摄影作品我们可以选择一些简洁、现代感强的字体像 Roboto Condensed、Montserrat 等这些字体线条流畅富有现代气息能与时尚主题相得益彰如果是一张古风的山水画那么像楷体、行书等具有传统韵味的字体可能会更合适它们能营造出古朴、典雅的氛围与山水画的意境相契合。颜色搭配也是提升水印美观度的关键因素。水印颜色要与图片的背景色形成一定的对比但又不能过于刺眼。例如对于深色背景的图片白色水印往往能清晰显示就像夜空中闪烁的星星醒目而又和谐对于浅色背景的图片我们可以选择一些深色的水印如深灰色、深蓝色等这些颜色既能突出水印又不会抢夺图片主体的风头就像在蓝天白云下一座深色的建筑虽不张扬但却稳固而醒目。除了美观度水印的安全性也不容忽视。为了防止水印被轻易去除我们可以采用一些加密算法。一种常见的方法是将水印信息进行加密处理后再嵌入到图片中。比如使用 AES高级加密标准算法它是一种对称加密算法具有较高的安全性。在嵌入水印时先将水印内容如文字、图片等用 AES 算法进行加密生成加密后的水印数据。然后将这些加密后的数据按照一定的规则嵌入到图片的像素值中。在提取水印时再使用相同的密钥和 AES 算法对嵌入的数据进行解密还原出水印信息。这样即使他人试图去除水印由于水印信息是加密的没有正确的密钥他们也无法准确地识别和去除水印从而有效地保护了图片的版权和信息安全。通过这些方法我们能够在提升水印美观度的同时增强水印的安全性让水印更好地发挥其作用。常见问题及解决方法水印添加失败在实现图片加水印功能的过程中可能会遇到水印添加失败的情况这往往会让开发者感到头疼。其中一个常见的原因是图片加载路径错误。当我们试图从指定路径加载图片时如果路径填写错误就像我们拿着一张错误的地图去找目的地自然无法找到图片也就无法进行水印添加操作。比如我们在代码中指定从 “/storage/emulated/0/Pictures/sample.jpg” 路径加载图片但实际图片存储在 “/storage/emulated/0/DCIM/Camera/sample.jpg” 路径这样就会导致图片加载失败进而水印添加失败。解决这个问题的方法很简单我们需要仔细检查图片的实际存储路径并确保在代码中正确填写。可以使用文件管理器等工具来确认图片的准确路径然后将其更新到代码中。内存不足也是导致水印添加失败的一个重要原因。在处理图片时尤其是高分辨率的图片Bitmap 对象会占用大量的内存。如果系统内存不足就无法创建或处理 Bitmap 对象从而导致水印添加失败。这就好比我们的电脑内存不足时运行大型软件会变得很卡顿甚至无法运行。为了解决这个问题我们可以采取一些内存优化方案。例如在加载图片时可以根据实际需求设置合适的采样率减少图片占用的内存。通过BitmapFactory.Options类的inSampleSize属性来设置采样率inSampleSize的值越大图片的分辨率就越低占用的内存也就越少。还可以及时回收不再使用的 Bitmap 对象释放内存。在 Kotlin 中可以调用bitmap.recycle()方法来回收 Bitmap 对象就像我们用完东西后及时清理腾出空间给其他物品一样。图片质量下降添加水印后图片质量下降也是一个常见的问题。这可能会让原本精美的图片变得模糊、有噪点影响图片的美观和使用价值。其中一个主要原因是压缩格式和参数设置不当。在将添加水印后的图片保存时如果选择了不合适的压缩格式就会导致图片质量受损。比如PNG 格式是无损压缩格式适合存储需要保留透明度和高质量的图片但文件体积较大而 JPEG 格式是有损压缩格式虽然可以有效减小文件体积但会牺牲一定的图片质量。如果我们将一张原本适合用 PNG 格式存储的图片在添加水印后保存为 JPEG 格式并且没有合理设置压缩参数就很容易导致图片质量下降。为了解决这个问题我们需要根据图片的特点和需求选择合适的压缩格式。如果图片对透明度有要求或者希望尽量保留图片的细节和质量那么 PNG 格式是更好的选择如果更注重文件体积的大小对图片质量的要求不是特别高比如一些用于网络展示的图片那么可以选择 JPEG 格式。在使用 JPEG 格式时我们还需要优化压缩参数。通过Bitmap.compress方法的第二个参数来设置压缩质量这个参数的取值范围是 0 - 100值越大表示压缩质量越高图片质量损失越小但文件体积也会越大。一般来说将压缩质量设置在 80 - 90 之间可以在保证一定图片质量的前提下有效减小文件体积。我们可以根据实际情况进行调整通过对比不同压缩参数下的图片质量和文件大小找到一个最佳的平衡点。这样就能在添加水印的同时尽量保持图片的质量让图片在满足版权保护和信息标识需求的依然能够保持良好的视觉效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2474396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…