当前位置: 首页 > news >正文

探索Apache Commons Imaging处理图像

第1章:引言

大家好,我是小黑,咱们今天来聊聊图像处理。在这个数字化日益增长的时代,图像处理已经成为了一个不可或缺的技能。不论是社交媒体上的照片编辑,还是专业领域的图像分析,图像处理无处不在。而作为一名Java开发者,小黑自然也对这一领域充满了兴趣。

为什么要选择Apache Commons Imaging(原名Sanselan)来进行图像处理呢?原因很简单:它是一个纯Java的库,不仅功能强大,而且使用起来非常方便。这个库支持广泛的图像格式,从常见的JPEG、PNG到专业的TIFF、PSD等,都能轻松处理。最重要的是,它的开源特性让咱们可以深入了解其内部工作机制,更好地掌握图像处理的精髓。

第2章:Apache Commons Imaging简介

Apache Commons Imaging,之前被称为Sanselan,是一个开源的Java图像库,主要用于读取、写入和操作图像数据。这个库的强大之处在于它对多种格式的图像文件都有很好的支持,比如JPEG、PNG、GIF、BMP,甚至还包括一些不太常见的格式,比如TIFF、PSD等。

为了让咱们更好地理解这个库的使用,小黑会在本篇博客中通过一系列的实际案例来展示它的功能。这样不仅能让咱们更加直观地了解Apache Commons Imaging,还能帮助咱们在实际项目中快速应用这些技巧。

咱们来看看如何在Java项目中添加Apache Commons Imaging。一般来说,如果咱们使用的是Maven来管理项目,只需在pom.xml文件中添加以下依赖:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-imaging</artifactId><version>1.0-alpha2</version>
</dependency>

接下来,小黑会展示一个简单的示例,让咱们看看如何使用Apache Commons Imaging来读取一个图像文件。假设咱们有一个名为“测试图片.jpg”的图像文件,想要读取它并获取一些基本信息,可以使用以下代码:

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImagingException;import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;public class ImageReaderExample {public static void main(String[] args) {try {File imageFile = new File("测试图片.jpg");BufferedImage image = Imaging.getBufferedImage(imageFile);// 输出基本信息System.out.println("图像格式: " + Imaging.guessFormat(imageFile));System.out.println("宽度: " + image.getWidth());System.out.println("高度: " + image.getHeight());} catch (ImagingException | IOException e) {e.printStackTrace();}}
}

在这段代码中,咱们首先读取了一个名为“测试图片.jpg”的文件,然后使用Imaging.getBufferedImage方法将其转换为BufferedImage对象。之后,咱们打印出了这个图像的格式、宽度和高度等信息。

第3章:依赖配置

对于使用Maven作为项目管理工具的情况,只需要在项目的pom.xml文件中添加相应的依赖。这里的依赖版本可能会随着时间更新,所以建议到Apache Commons Imaging的官方网站查看最新版本。下面是一个示例的依赖配置:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-imaging</artifactId><version>1.0-alpha2</version> <!-- 这里的版本号需要根据最新版本进行调整 -->
</dependency>

加入这段依赖后,Maven会自动处理所需库的下载和管理。接下来,咱们来看看如何使用这个库来进行一些基本的图像操作。比如说,读取一张图像并显示其基本信息,这是图像处理中最基础的一步。

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem;
import java.io.File;
import java.util.List;public class BasicImageInfo {public static void main(String[] args) {try {File imageFile = new File("测试图片.jpg"); // 图像文件路径List<ImageMetadataItem> metadata = Imaging.getMetadata(imageFile).getItems();for (ImageMetadataItem item : metadata) {System.out.println(item.toString()); // 打印图像的元数据}} catch (Exception e) {e.printStackTrace();}}
}

在这个例子中,小黑使用了Imaging.getMetadata方法来获取图像文件的元数据,并逐个打印出来。这种操作对于理解图像的属性,比如相机设置、拍摄时间等信息非常有用。

图像处理不仅仅是关于读取信息,还包括修改、转换等多种操作。为了进行这些操作,咱们需要确保环境搭建正确无误。在实际开发中,可能会遇到各种问题,比如依赖冲突、版本不兼容等。这时候,查看官方文档、搜索相关问题解决方案或者在社区寻求帮助是非常必要的。

通过以上步骤,咱们就能够在Java项目中成功集成Apache Commons Imaging,并进行基础的图像处理操作了。

第4章:读取和写入图像

读取图像

读取图像是开始任何图像处理任务的第一步。在Apache Commons Imaging中,这个过程非常直观。咱们可以使用Imaging.getBufferedImage方法来读取图像文件。让小黑来展示一下这个过程:

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImagingException;import java.io.File;
import java.awt.image.BufferedImage;public class ReadImageExample {public static void main(String[] args) {try {File imageFile = new File("测试图片.jpg"); // 图像文件路径BufferedImage image = Imaging.getBufferedImage(imageFile);System.out.println("图像宽度: " + image.getWidth());System.out.println("图像高度: " + image.getHeight());// 这里可以添加更多的操作,比如分析图像内容等} catch (ImagingException | IOException e) {e.printStackTrace();}}
}

在这个例子中,小黑首先创建了一个指向图像文件的File对象。然后,使用Imaging.getBufferedImage方法读取这个文件,并将其转换为一个BufferedImage对象。这样就可以获取到图像的宽度、高度等基本信息了。

写入图像

读取图像之后,通常咱们可能会对图像进行一系列处理,如调整大小、应用滤镜等。处理完成后,接下来的任务就是将修改后的图像保存回文件。下面是一个简单的示例,展示如何将处理后的图像写入文件:

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImagingException;import java.io.File;
import java.awt.image.BufferedImage;public class WriteImageExample {public static void main(String[] args) {try {File inputFile = new File("原始图片.jpg");BufferedImage image = Imaging.getBufferedImage(inputFile);// 在这里可以对image进行各种处理...File outputFile = new File("处理后的图片.jpg");Imaging.writeImage(image, outputFile, ImageFormats.JPEG, null);System.out.println("图像保存成功!");} catch (ImagingException | IOException e) {e.printStackTrace();}}
}

在这个例子中,小黑先读取了一个名为“原始图片.jpg”的文件,进行了一些假设的处理(比如调整大小、应用滤镜等),然后将处理后的图像保存为“处理后的图片.jpg”。这里使用了Imaging.writeImage方法,它允许咱们指定图像格式和一些写入参数。

第5章:图像转换和处理

图像格式转换

在日常工作中,咱们经常需要将图像从一种格式转换成另一种格式。比如,可能需要把PNG格式的图片转换成JPEG格式,以便于网络传输或者兼容性更好。小黑这就来展示一个简单的格式转换过程:

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImagingException;import java.io.File;
import java.awt.image.BufferedImage;public class ImageFormatConversion {public static void main(String[] args) {try {File inputFile = new File("原始图片.png");BufferedImage image = Imaging.getBufferedImage(inputFile);File outputFile = new File("转换后的图片.jpg");Imaging.writeImage(image, outputFile, ImageFormats.JPEG, null);System.out.println("格式转换完成!");} catch (ImagingException | IOException e) {e.printStackTrace();}}
}

在这个例子中,小黑首先读取了一个PNG格式的图像文件“原始图片.png”,然后使用Imaging.writeImage方法将其保存为JPEG格式的文件“转换后的图片.jpg”。这个过程非常简单,但在实际应用中却非常有用。

基本图像处理

除了格式转换,咱们还可以进行一些基本的图像处理操作,比如调整图像大小、裁剪、旋转等。下面是一个调整图像大小的示例:

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImagingException;import java.io.File;
import java.awt.image.BufferedImage;public class ResizeImage {public static void main(String[] args) {try {File inputFile = new File("原始图片.jpg");BufferedImage image = Imaging.getBufferedImage(inputFile);BufferedImage resizedImage = resizeImage(image, 200, 200); // 调整为200x200像素File outputFile = new File("调整大小后的图片.jpg");Imaging.writeImage(resizedImage, outputFile, ImageFormats.JPEG, null);System.out.println("图像大小调整完成!");} catch (ImagingException | IOException e) {e.printStackTrace();}}private static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) throws IOException {BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);Graphics2D graphics2D = resizedImage.createGraphics();graphics2D.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);graphics2D.dispose();return resizedImage;}
}

在这个例子中,小黑创建了一个名为resizeImage的方法,它接受一个BufferedImage对象和目标宽高,返回一个调整大小后的新图像。这种操作在处理用户上传的图片或者为网页准备缩略图时非常有用。

第6章:元数据处理

读取元数据

在Apache Commons Imaging中,读取图像元数据是一个简单而强大的过程。咱们可以获取到很多有关图像的详细信息。下面是一个读取JPEG图像元数据的示例:

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;import java.io.File;
import java.util.List;public class ReadMetadataExample {public static void main(String[] args) {try {File jpegImageFile = new File("测试图片.jpg");final ImageMetadata metadata = Imaging.getMetadata(jpegImageFile);final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;if (jpegMetadata != null) {// 打印所有元数据项List<ImageMetadataItem> items = jpegMetadata.getItems();for (ImageMetadataItem item : items) {System.out.println(item);}// 获取特定的元数据项,例如拍摄时间String shootingTime = jpegMetadata.findEXIFValueWithExactMatch(TiffTagConstants.TIFF_TAG_DATE_TIME).toString();System.out.println("拍摄时间: " + shootingTime);}} catch (Exception e) {e.printStackTrace();}}
}

在这个示例中,小黑读取了一个JPEG图像文件的元数据,并打印出了所有的元数据项。此外,还特别获取了拍摄时间这一具体的元数据信息。这对于管理大量图像,尤其是对于摄影师来说,是非常有用的。

修改和添加元数据

除了读取元数据,Apache Commons Imaging还允许咱们修改或添加新的元数据信息。这对于个性化图像处理、版权信息添加等场景非常有用。不过,需要注意的是,修改元数据是一个相对复杂的过程,涉及到图像格式和元数据标准的深入理解。

由于修改元数据是一个相对复杂的过程,涉及到直接操作图像的底层数据,所以这个例子将会相对复杂一些。不过别担心,小黑会尽量用清晰的注释来说明每一步的作用。

import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.common.RationalNumber;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
import org.apache.commons.imaging.formats.tiff.TiffOutputDirectory;
import org.apache.commons.imaging.formats.tiff.TiffOutputField;
import org.apache.commons.imaging.formats.tiff.TiffOutputSet;
import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class ModifyMetadataExample {public static void main(String[] args) {try {File jpegImageFile = new File("测试图片.jpg");File outputFile = new File("修改元数据后的图片.jpg");OutputStream os = null;try {TiffOutputSet outputSet = null;// 尝试读取图像的元数据final ImageMetadata metadata = Imaging.getMetadata(jpegImageFile);final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;if (jpegMetadata != null) {final TiffImageMetadata exif = jpegMetadata.getExif();if (exif != null) {outputSet = exif.getOutputSet();}}// 如果JPEG图像没有Exif元数据,则创建一个新的输出集if (outputSet == null) {outputSet = new TiffOutputSet();}// 添加自定义注释final TiffOutputDirectory exifDirectory = outputSet.getOrCreateExifDirectory();exifDirectory.add(TiffOutputField.create(TiffTagConstants.TIFF_TAG_IMAGE_DESCRIPTION, outputSet.byteOrder, "自定义注释"));// 修改现有元数据,例如修改拍摄时间exifDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);exifDirectory.add(TiffOutputField.create(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, outputSet.byteOrder, "2023:01:01 00:00:00"));os = new FileOutputStream(outputFile);new ExifRewriter().updateExifMetadataLossless(jpegImageFile, os, outputSet);} finally {if (os != null) {try {os.close();} catch (IOException e) {// 忽略关闭异常}}}System.out.println("元数据修改完成!");} catch (ImageReadException | ImageWriteException | IOException e) {e.printStackTrace();}}
}

在这个代码中,小黑首先尝试从原始JPEG图像中读取元数据。如果图像包含Exif元数据,小黑将使用这些元数据来创建一个TiffOutputSet对象。接着,小黑在Exif目录中添加了一个自定义的注释字段,并修改了拍摄时间字段。最后,使用ExifRewriter类的updateExifMetadataLossless方法将修改后的元数据写回到一个新的JPEG文件中。

这个过程显示了如何在不损失图像质量的情况下,修改JPEG图像的Exif元数据。这对于添加版权信息、个性化标签或其他重要信息到图像中非常有用。不过,需要注意的是,操作元数据时要格外小心,因为错误的操作可能会损坏图像文件。

第7章:错误处理和性能优化

错误处理

在进行图像处理时,常常会遇到各种错误,比如文件格式不支持、文件损坏、内存不足等。正确地处理这些错误可以提高程序的健壮性和用户体验。小黑来展示一个基本的错误处理示例:

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImagingException;import java.io.File;
import java.awt.image.BufferedImage;public class ErrorHandlingExample {public static void main(String[] args) {try {File imageFile = new File("可能不存在的图片.jpg");BufferedImage image = Imaging.getBufferedImage(imageFile);// 进行一些图像处理操作...} catch (ImagingException e) {System.err.println("图像处理错误: " + e.getMessage());// 这里可以记录日志或者通知用户错误信息} catch (IOException e) {System.err.println("文件读写错误: " + e.getMessage());// 处理文件读写异常} catch (Exception e) {System.err.println("未知错误: " + e.getMessage());// 处理其他未预见的异常}}
}

在这个例子中,小黑尝试读取一个图像文件,并在此过程中捕获可能出现的异常。根据不同类型的异常,程序会输出相应的错误信息。这种做法可以帮助调试程序,并在出现问题时提供更清晰的指示。

性能优化

在图像处理中,性能优化同样至关重要。尤其是处理大量或高分辨率的图像时,效率成为一个不容忽视的问题。下面小黑会介绍一些基本的性能优化技巧。

  1. 合理管理内存: 图像处理通常是内存密集型的操作。对于大图像,尽量使用缩放或分块处理的方式来减少内存占用。

  2. 避免不必要的重复读写: 读取和写入图像是耗时操作。如果需要对同一图像执行多个操作,考虑先将图像读入内存,完成所有处理后再统一写回。

  3. 利用多线程: 当处理多个图像时,可以考虑使用多线程来并行处理,以提高效率。

  4. 调整缓存和IO策略: 根据实际需要调整缓存策略和IO操作,避免频繁的磁盘访问。

这些只是一些基础的性能优化建议。在实际应用中,根据具体的需求和环境,还可以采取更多的优化措施。

第8章:总结

实际应用案例
  1. 社交媒体自动化工具: 假设你在开发一个社交媒体管理工具,需要自动调整上传图片的大小和格式。使用Apache Commons Imaging,你可以轻松实现这一功能,确保每张图片都符合社交媒体平台的要求。

  2. 数字图像存档系统: 在数字图像存档系统中,保留图像的元数据信息非常重要。Apache Commons Imaging可以帮助你读取和编辑这些信息,确保每张图像都有正确的描述、版权信息和拍摄日期。

  3. 个性化图像生成器: 想象一下,你在为一个广告公司工作,需要生成大量包含特定文本和图案的图像。利用Apache Commons Imaging,你可以自动化这一过程,为每个客户快速定制个性化图像。

通过这些实际应用案例,我们可以看到Apache Commons Imaging在不同场景下的灵活性和实用性。无论你是在处理个人项目,还是开发复杂的商业应用,这个库都能提供强大的支持。

小黑希望你已经对Apache Commons Imaging有了全面的了解。通过这系列文章,我们一起深入探索了它的主要功能和应用场景。图像处理是一个既有趣又充满挑战的领域,而Apache Commons Imaging则是一把强大的工具,帮助你在这个领域里游刃有余。

相关文章:

探索Apache Commons Imaging处理图像

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊图像处理。在这个数字化日益增长的时代&#xff0c;图像处理已经成为了一个不可或缺的技能。不论是社交媒体上的照片编辑&#xff0c;还是专业领域的图像分析&#xff0c;图像处理无处不在。而作为…...

【11】ES6:async/await

一、概念 async/await 是 ES2017&#xff08;ES8&#xff09;的新特性&#xff0c;它是一种基于 Promise 实现的异步编程方式。async/await 也是一种语法糖。 1、async/await 实现了用同步方式来写异步代码&#xff08;promise是链式调用形式写异步代码&#xff09; 2、asyn…...

深入理解Java集合框架

导语&#xff1a; Java集合框架是Java提供的一组用于管理对象的类和接口&#xff0c;它是Java编程中非常重要的一部分。Java集合框架通过提供诸如List、Set、Map等数据结构&#xff0c;为程序员提供了一种方便、高效的管理对象的方式。本文将深入理解Java集合框架&#xff0c;包…...

极智嘉加快出海发展步伐,可靠产品方案获客户认可

2023年&#xff0c;国内本土企业加快出海征程&#xff0c;不少企业在出海发展中表现出了优越的集团实力与创新的产品优势&#xff0c;有力彰显了我国先进的科技研发实力。作为全球仓储机器人引领者&#xff0c;极智嘉&#xff08;Geek&#xff09;也在不断加快出海发展步伐&…...

运动目标检测方法的概述

目录 ① 光流法 ② 帧差法 ③ 背景差分法 ④ 混合高斯模型法 ⑤ 总结 运动目标检测技术的应用十分的广泛&#xff0c;尤其是在智能视频监控领域。运动目标检测为后续的图像处理等操作提供了基础&#xff0c;在某种程度上&#xff0c;决定了整个系统的性能。运动目标检测&a…...

【Qt-Edit】

Qt编程指南 ■ QTextEdit■ QLineEdit■ QLineEdit 设置正则表达式■ QPlainTextEdit■ QKeySequenceEdit■ QList<QLineEdit *> edits■■■ QTextEdit /* 实例和对象,设置位置和显示大小 */ textEdit = new QTextEdit(this)...

vue data变量不能以“_”开头,否则会产生很多怪异问题

1、 比如给子组件赋值&#xff0c;子组件无法得到这个值&#xff08;也不是一直无法得到&#xff0c;设置后this.$forceUpdate() 居然可以得到&#xff09;&#xff0c; 更无法watch到 <zizujian :config"_config1"> </zizujian>this._config1 { ...…...

解释RestFUL API,以及如何使用它构建web程序

RESTful API&#xff08;Representational State Transfer&#xff09;是一种基于网络的软件架构风格&#xff0c;用于构建分布式系统。它利用 HTTP 协议中的各种方法&#xff08;如 GET、POST、PUT、DELETE&#xff09;来对资源进行操作&#xff0c;使得不同应用程序能够相互通…...

文件下载输出zip文件

文件下载输出成zip文件&#xff1a; 1、前端整个按钮&#xff0c;调js方法&#xff1a;&#xff08;参数&#xff1a;param,需要下载的id&#xff0c;用逗号拼接&#xff09; var param "?dto.id";//需要自己拼接param window.location.href "<%basePat…...

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

作者&#xff1a;柳下 概述 随着企业规模和数据量的增长&#xff0c;数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂&#xff0c;因此及时捕获和处理这些变化变得至关重要。为了满足这一需求&#xff0c;数据库 CDC&#xff08;Change Data Capture&#xff…...

鸿蒙开发(二)- 鸿蒙DevEco3.X开发环境搭建

上篇说到&#xff0c;鸿蒙开发目前势头旺盛&#xff0c;头部大厂正在如火如荼地进行着&#xff0c;华为也对外宣称已经跟多个厂商达成合作。目前看来&#xff0c;对于前端或客户端开发人员来说&#xff0c;掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…...

Openslide安装

文章目录 安装open-slide python下载openslide二进制文件解压到Anaconda的library目录下配置环境变量在py文件中添加以下语句即可 官网链接 安装open-slide python 表面上这样就可以导入了但事实上会遇到 Couldn’t locate OpendSlide DLL的问题&#xff0c;openslide必须独立安…...

【ES】Elasticsearch常见问题与解决(持续更新)

目录 Elasticsearch常见问题 1. 集群健康问题 2. 性能问题 3. 映射问题 4. 分片问题 5. 内存问题 6. 硬件问题 7. 配置问题 8. 安全问题 9. 网络问题 10. 版本不兼容 Elasticsearch日常使用小结 【Q】离线告警&#xff0c;有IP已离线 【Q】统计某个应用的某个索引…...

2023.12.29 Python面向对象 封装_继承_多台

目录 1.封装-私有与公开权限 2.继承 2.1多继承 2.2继承多层传递 2.3重写父类方法 2.4继承链 2.5禁止私有继承 3.多态 4.总结 1.封装-私有与公开权限 公开属性、公开方法&#xff1a;随便调用 私有属性、私有方法&#xff1a; 只能在类定义的内部调用 以两个下划线开头__的…...

通过自然语言处理增强推荐系统:协同方法

一、介绍 自然语言处理 (NLP) 是人工智能的一个分支&#xff0c;专注于使机器能够以有意义且有用的方式理解、解释和响应人类语言。它包含一系列技术&#xff0c;包括情感分析、语言翻译和聊天机器人。 另一方面&#xff0c;推荐系统&#xff08;RecSys&#xff09;是旨在向用户…...

大创项目推荐 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习OCR中文识别系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;…...

Python经典游戏 唤醒你童年记忆

这些游戏你玩过几个&#xff1f; 1.贪吃蛇2.吃豆人3.加农炮4.四子棋5. Fly Bird<font color #f3704ab>6.记忆&#xff1a;数字对拼图游戏&#xff08;欢迎挑战&#xff01;用时&#xff1a;2min&#xff09;7.乒乓球8.上课划水必备-井字游戏&#xff08;我敢说100%的人都…...

什么是骨传导耳机?骨传导能保护听力吗?

骨传导耳机是一种非常特殊的蓝牙耳机&#xff0c;它通过骨传导技术将声音直接传送到内耳。这种技术不同于传统耳机&#xff0c;它不通过空气传送声音&#xff0c;而是通过头骨的振动来传送声音。 并且骨传导耳机能够在一定程度上起到保护听力的作用&#xff0c;主要是因为它们不…...

使用electron属性实现保存图片并获取图片的磁盘路径

在普通的网页开发中&#xff0c;JavaScript由于安全性的考虑&#xff0c;通常是无法直接获取到客户端的磁盘路径的。浏览器出于隐私和安全原因对此类信息进行了限制。 在浏览器环境下&#xff0c;JavaScript主要通过Web APIs来与浏览器进行交互&#xff0c;而这些API通常受到浏…...

进击的奶牛

题目 进击的奶牛 题意 通过二分查找算法找到一个最小间距x&#xff0c;使得在数组a中选出的k个数两两之间的间距都不小于x&#xff0c;并且x尽可能大。最后输出这个最大的x值。 思路 程序通过循环依次获取了n个整数&#xff0c;存储在数组a中。.然后&#xff0c;程序对数组a进…...

12月27日,每日信息差

以下是2023年12月27日的8条信息差 第一、小米公司&#xff1a;小米汽车正式加入小米“人车家全生态”&#xff0c;随着小米汽车的即将发布&#xff0c;小米“人车家全生态”也实现了真正闭环 第二、吉利将于2024年初发射11颗卫星&#xff0c;吉利银河E8率先搭载卫星通信技术。…...

【赠书第14期】AI短视频制作一本通:文本生成视频+图片生成视频+视频生成视频

文章目录 前言 1 前期准备 2 拍摄与录制 3 后期编辑 4 技巧与注意事项 5 推荐图书 6 粉丝福利 前言 随着智能技术的迅猛发展&#xff0c;AI 短视频制作成为了一种新兴而创新的表达方式&#xff0c;广泛应用于社交媒体、广告营销、教育培训等领域。本文将介绍 AI 短视频…...

简单工厂设计模式(计算器实例优化)

简单工厂设计模式&#xff08;计算器实例优化&#xff09; 介绍为什么采用面向对象编程而不是面向过程呢&#xff1f;实例讲解业务层划分出来逻辑层继承简单工厂&#xff1a;&#xff08;多态&#xff09;业务层&#xff1a;&#xff08;解耦合&#xff09;主控制台 总结 介绍 …...

iconify图标集离线使用方案简介

1.需求描述 前端项目&#xff0c;技术栈使用Vue3Element Plus&#xff0c;参考了ruoyi-vue-pro项目与vue-element-plus-admin项目&#xff0c;封装了一个Icon组件&#xff0c;图标使用的是iconify,项目部署在内网环境&#xff0c;不能连接互联网&#xff0c;需要部署一套iconi…...

java基础之理解多态

目录 简单理解 满足多态的三个条件 有类继承或者接口实现 子类要重写父类的方法 父类的引用指向子类的对象。 代码示例 动态多态 静态多态 个人观点 简单理解 简单理解就是&#xff0c;同一操作作用于不同的对象&#xff0c;可以有不同的解释&#xff0c;产生不同的执…...

第二证券:A股市场放量反弹 跨年行情或启动

沪指日线等级放量反弹&#xff0c;周四收中阳线成功站上20日均线&#xff0c;底部结构或可树立。创业板指大涨近4%&#xff0c;日线MACD出现底违反&#xff0c;多方动能较强&#xff0c;中等级反弹行情或在酝酿。月线来看&#xff0c;12月创业板指探底上升出现较长下影&#xf…...

web漏洞与修复

一、web漏洞 检测到目标X-Content-Type-Options响应头缺失 详细描述X-Content-Type-Options HTTP 消息头相当于一个提示标志&#xff0c;被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定&#xff0c;而不能对其进行修改。这就禁用了客户端的 MIM…...

基于Java+SpringBoot+vue实现图书借阅管理系统

基于JavaSpringBootvue实现图书借阅和销售商城一体化系统 &#x1f345; 作者主页 程序设计 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringBootvue实现图书借阅和销售商城一体化…...

xml文件学习(xml格式)可扩展标记语言(Extensible Markup Language)

XML 教程 文章目录 XML 文件学习1. XML 概述1.1 什么是 XML&#xff1f;1.2 XML 有什么作用&#xff1f; 2. XML 基本结构1. 声明2. 元素3. 属性4. 文本5. 注释 3. XML 高级知识3.1 XML 命名空间3.2 XML 架构3.3 XML 工具3.4 XML 技术 4. XML 应用实例 XML 文件学习 XML&#…...

nodejs+vue+ElementUi家政服务系统c90g5

项目中登录模块用到token家政服务平台有管理员&#xff0c;雇主&#xff0c;雇员三个角色。管理员功能有个人中心&#xff0c;雇主管理&#xff0c;雇员管理&#xff0c;资料认证管理&#xff0c;项目类型管理&#xff0c;服务项目管理&#xff0c;需求信息管理&#xff0c;服务…...

谷歌做英文网站/网站推广和优化系统

http://blog.csdn.net/luozhuang/archive/2011/04/11/6314609.aspx 经过测试 原来安装补丁 不支持 win64 位系统 这是 经过测试 补丁 https://www.easy-share.com/1914942733/ 另外 这是有人求得 1 和2 运行&#xff25;&#xff38;&#xff25; 文件 https://www.easy-sha…...

购物网站开发什么是网站开发/影视剪辑培训机构排名

摘要&#xff1a;/* * config.php文件代码 */<?php /** * Smarty 配置文件 */require __DIR__."/../smarty-3.1.33/libs/Smarty.class.php";//创建smarty模板引擎对象$smarty new Smarty();//echo 默认模板目录是&#xff1a;.pr/** config.php文件代码*//*** S…...

安宁网站建设 熊掌/网站制作建设

Shell中的join方法(超详细) 将两个文件里指定栏位置同样的行连接起来&#xff0c; 即依照两个文件中共同拥有的某一列&#xff0c;将相应的行拼成一行(原文件不改变) 内连接(忽略不匹配的行) join file1 file2 显示左边文件中所有记录&#xff0c;右边文件中没有匹配的显示空白…...

网站开发php是什么意思/域名注册需要多少钱

一。CxImage类库简介 这只是翻译了CxImage开源项目主页上的部分简介及简单使用。 CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说&#xff0c;有那么多优秀的图形库&#xff0c;如OpenIL,FreeImage,PaintLib等等&#xff0c;它们…...

社区教育网站建设项目计划书/如何在百度发布信息

DX11进行不动了&#xff0c;师兄让我继续进行DX9&#xff0c;DX9的DX9地形这本书应该不错&#xff0c;结合了SHADER和地形引擎&#xff0c;虽然很早买了&#xff0c;但是当时不懂SHADER&#xff0c;所以没看懂&#xff0c;OSGEARTH视频教程和软引擎也要继续进行。太多了也进行不…...

做字幕网站有哪些/推广产品的方法和步骤

文/美美教育说俗话说&#xff1a;学好数理化&#xff0c;走遍全天下。理工类知识一直以来都是用途很广泛的&#xff0c;从每年的高考志愿中我们也不难看出&#xff0c;工科类院校的报考人数居高不下。一直以来我们都习惯把理科和工科统称为“理工科”&#xff0c;但实际上他们二…...