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

安卓基础(MediaProjection)

1. Display 类
  • ​作用​​:代表显示设备(手机屏幕、外接显示器)
  • ​常用方法​​:
display.getRotation() // 获取屏幕方向(横屏/竖屏)
display.getRefreshRate() // 获取屏幕刷新率(如:60Hz)
2. Point 类
  • ​结构​​:
public class Point {public int x; // 横坐标public int y; // 纵坐标
}
  • ​为什么用Point​​:比单独用两个int变量更规范
3. 单位说明
  • ​像素(px)​​:代码获取的是像素值
  • ​换算公式​​:
// 像素转dp(适配不同密度屏幕)
float dp = px / (getResources().getDisplayMetrics().density);

完整代码

// 在Activity的onCreate方法中获取屏幕尺寸
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取屏幕尺寸Display display = getWindowManager().getDefaultDisplay();Point size = new Point();display.getSize(size);  //把屏幕的大小记录到size的x和y上面int screenWidth = size.x;int screenHeight = size.y;// 实际应用:设置TextView显示尺寸TextView sizeInfo = findViewById(R.id.tv_size);sizeInfo.setText("屏幕宽度:" + screenWidth + "px\n屏幕高度:" + screenHeight + "px");// 打印到LogcatLog.d("ScreenSize", "宽度:" + screenWidth + " 高度:" + screenHeight);
}

ImageReader​

// 参数说明:
// 宽度 | 高度 | 图像格式 | 最大缓存图像数(建议2-3)
ImageReader imageReader = ImageReader.newInstance(1080, 1920, ImageFormat.YUV_420_888, 3);

Bitmap

本质是什么?
  • ​像素集合​​:由 width x height 个像素点组成
  • ​内存结构​​:每个像素存储颜色信息(如红绿蓝透明度)
  • ​数据载体​​:可来自文件、摄像头、网络或手动绘制
// 1. 创建文件路径
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"screenshot_" + System.currentTimeMillis() + ".png");// 2. 保存Bitmap到该路径
try (FileOutputStream out = new FileOutputStream(file)) {// 将 Bitmap 以 PNG 格式压缩并保存到文件中bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);  Toast.makeText(this, "保存成功:" + file.getPath(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {e.printStackTrace();
}
1. ​​确定保存位置​
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
  • ​翻译​​:获取手机系统预设的「公共图片文件夹」
  • ​实际路径举例​​:
    • 旧安卓:/sdcard/Pictures/
    • 新安卓(Android 10+):/内部存储/DCIM/Pictures/
2. ​​生成唯一文件名​
"screenshot_" + System.currentTimeMillis() + ".png"
  • ​当前时间戳​​:System.currentTimeMillis() 获取1970年至今的毫秒数(如 1625043725123
  • ​示例文件名​​:screenshot_1625043725123.png
  • ​为什么用时间戳​​:防止文件名重复

createVirtualDisplay 的作用是​​创建一个虚拟的屏幕镜像​

想象你有一台手机,现在要把它屏幕上的内容​​实时投影到另一台设备​​上。createVirtualDisplay 就相当于在这台手机内部​​安装了一个隐藏的摄像头​​,这个摄像头会持续拍摄屏幕内容,并将画面传递给处理单元(例如保存为图片或视频)。

实际应用场景​

1. 屏幕截图功能
// 初始化ImageReader(接收画面)
ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);// 创建虚拟显示屏绑定到ImageReader
virtualDisplay = mediaProjection.createVirtualDisplay(...);// 从ImageReader获取图像
Image image = imageReader.acquireLatestImage();
Bitmap bitmap = imageToBitmap(image); // 转换为Bitmap

把虚拟屏幕展示传送给图片读取器的surface

imageReader.getSurface()

// 创建虚拟显示屏
virtualDisplay = mediaProjection.createVirtualDisplay("ScreenCapture",width, height, getResources().getDisplayMetrics().densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,imageReader.getSurface(), null, null);


完整代码

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.Image;
import android.media.ImageReader;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.os.Environment;
import android.view.Display;
import android.view.Surface;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;// 主活动类,继承自 AppCompatActivity
public class MainActivity extends AppCompatActivity {// 屏幕捕获权限请求码private static final int REQUEST_CODE_SCREEN_CAPTURE = 1;// 写入外部存储权限请求码private static final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 2;// MediaProjectionManager 实例,用于管理屏幕投影private MediaProjectionManager mediaProjectionManager;// MediaProjection 实例,用于实际的屏幕投影操作private MediaProjection mediaProjection;// ImageReader 实例,用于读取屏幕图像private ImageReader imageReader;// VirtualDisplay 实例,用于创建虚拟显示屏private VirtualDisplay virtualDisplay;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 通过系统服务获取 MediaProjectionManager 实例mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);// 检查是否有写入外部存储的权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {// 若没有权限,请求写入外部存储权限ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CODE_WRITE_EXTERNAL_STORAGE);} else {// 若已有权限,请求屏幕捕获权限requestScreenCapturePermission();}}// 请求屏幕捕获权限的方法private void requestScreenCapturePermission() {// 创建屏幕捕获的 IntentIntent captureIntent = mediaProjectionManager.createScreenCaptureIntent();// 启动 Intent 并等待用户授权,使用请求码 REQUEST_CODE_SCREEN_CAPTUREstartActivityForResult(captureIntent, REQUEST_CODE_SCREEN_CAPTURE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 检查请求码是否为屏幕捕获请求码if (requestCode == REQUEST_CODE_SCREEN_CAPTURE) {if (resultCode == Activity.RESULT_OK) {// 若用户授予了屏幕捕获权限,通过 MediaProjectionManager 获取 MediaProjection 实例mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);// 开始屏幕捕获操作startScreenCapture();} else {// 若用户拒绝了屏幕捕获权限,显示提示信息Toast.makeText(this, "屏幕捕获权限被拒绝", Toast.LENGTH_SHORT).show();}}}// 开始屏幕捕获的方法private void startScreenCapture() {// 获取默认显示屏对象Display display = getWindowManager().getDefaultDisplay();// 创建一个 Point 对象用于存储屏幕尺寸Point size = new Point();// 获取屏幕的尺寸并存储到 Point 对象中display.getSize(size);// 获取屏幕的宽度int width = size.x;// 获取屏幕的高度int height = size.y;// 创建 ImageReader 实例,用于读取屏幕图像imageReader = ImageReader.newInstance(width, height, ImageFormat.RGB_565, 2);// 为 ImageReader 设置图像可用监听器imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {Image image = null;try {// 从 ImageReader 中获取最新的图像image = reader.acquireLatestImage();if (image != null) {// 获取图像的平面数组Image.Plane[] planes = image.getPlanes();// 获取第一个平面的 ByteBufferByteBuffer buffer = planes[0].getBuffer();// 获取像素步长int pixelStride = planes[0].getPixelStride();// 获取行步长int rowStride = planes[0].getRowStride();// 计算行填充int rowPadding = rowStride - pixelStride * width;// 创建一个 Bitmap 对象,用于存储图像数据Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.RGB_565);// 将 ByteBuffer 中的数据复制到 Bitmap 中bitmap.copyPixelsFromBuffer(buffer);// 裁剪 Bitmap 去除多余的填充bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);// 保存截图到文件saveBitmapToFile(bitmap);// 关闭 Image 对象,释放资源image.close();}} catch (Exception e) {// 若出现异常,打印异常信息e.printStackTrace();} finally {if (image != null) {// 确保 Image 对象被关闭image.close();}}}}, null);// 创建虚拟显示屏virtualDisplay = mediaProjection.createVirtualDisplay("ScreenCapture",width, height, getResources().getDisplayMetrics().densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,imageReader.getSurface(), null, null);}// 保存 Bitmap 到文件的方法private void saveBitmapToFile(Bitmap bitmap) {// 创建一个文件对象,指定保存路径和文件名File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"screenshot_" + System.currentTimeMillis() + ".png");try (FileOutputStream fos = new FileOutputStream(file)) {// 将 Bitmap 以 PNG 格式压缩并保存到文件中bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);// 显示保存成功的提示信息Toast.makeText(this, "截图已保存到 " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();} catch (IOException e) {// 若保存过程中出现异常,打印异常信息并显示保存失败的提示信息e.printStackTrace();Toast.makeText(this, "保存截图失败", Toast.LENGTH_SHORT).show();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// 检查请求码是否为写入外部存储权限请求码if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 若权限授予成功,请求屏幕捕获权限requestScreenCapturePermission();} else {// 若权限授予失败,显示提示信息Toast.makeText(this, "写入外部存储权限被拒绝", Toast.LENGTH_SHORT).show();}}}@Overrideprotected void onDestroy() {super.onDestroy();if (virtualDisplay != null) {// 释放虚拟显示屏资源virtualDisplay.release();}if (mediaProjection != null) {// 停止 MediaProjection 操作mediaProjection.stop();}if (imageReader != null) {// 关闭 ImageReader 资源imageReader.close();}}
}    

123

相关文章:

安卓基础(MediaProjection)

1. Display 类 ​​作用​​:代表显示设备(手机屏幕、外接显示器)​​常用方法​​: display.getRotation() // 获取屏幕方向(横屏/竖屏) display.getRefreshRate() // 获取屏幕刷新率(如&…...

Android Compose 物联网(IoT)UI 组件库封装指南

Android Compose 物联网封装组件 在物联网(IoT)应用开发中,使用Jetpack Compose可以创建现代化、响应式的用户界面。以下是一些针对物联网场景的Compose封装组件思路和实现方法: 常用物联网组件封装 1. 设备状态指示器 Composable fun DeviceStatusI…...

实用在线工具箱OmniTools

简介 OmniTools 是一个自托管的网络应用,提供多种在线工具,旨在简化日常任务。它包含了一系列独立的、小型但实用的工具,涵盖了文件处理、文本操作、网络请求、系统监控等多个方面。 OmniTools 的设计理念是简单、易用、可定制,方…...

【AI大模型学习路线】第一阶段之大模型开发基础——第三章(大模型实操与API调用)单轮对话与多轮对话调用。

【AI大模型学习路线】第一阶段之大模型开发基础——第三章(大模型实操与API调用)单轮对话与多轮对话调用? 【AI大模型学习路线】第一阶段之大模型开发基础——第三章(大模型实操与API调用)单轮对话与多轮对话调用&…...

数字化转型进阶:26页华为数字化转型实践分享【附全文阅读】

本文分享了华为数字化转型的实践经验和体会。华为通过数字化变革,致力于在客户服务、供应链、产品管理等方面提高效率,并把数字世界带入每个组织,构建万物互联的智能世界。华为的数字化转型愿景是成为行业标杆,通过推进数字化战略、构建面向业务数字化转型的IT组织阵型、坚…...

Go语言的优势与应用场景 -《Go语言实战指南》

一、 Go语言的五大核心优势 1. 语法简洁,开发高效 Go语言借鉴了C语言的表达方式,但去掉了多余复杂的特性(如继承、多态、异常处理等),语法风格清晰明了,极大地降低了学习成本: • 无需头文件…...

3D人物关系图开发实战:Three.js实现自动旋转可视化图谱(附完整代码)

3D人物关系图开发实战:Three.js实现自动旋转可视化图谱 效果核心解析场景初始化自动旋转控制器节点创建(带图片和标签)关系连线动画循环数据格式说明 代码 效果 本文将带您使用Three.js实现一个带自动旋转功能的3D人物关系图谱,核…...

文件操作-

1. 为什么使⽤⽂件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化…...

硬件零基础入门(尚硅谷)

1 一个碳原子有一个自由电子。所以能够导电。 金刚石四个都是都弄成共价键了,所以没有自由电子不能自由电子。 2 新的电子进来,因为互斥电荷进行了定向运动,产生了能量。两边电子平衡就停止了。所以电池的负极有电子。 电荷就是质子和电…...

【Ai零件】高德开放平台MCP的API-key注册

前言 基本操作文档,为n8n等平台,调用高德MCP服务做准备,本文记录其API-Key的生成步骤。 操作步骤 高德开发平台官网:https://lbs.amap.com/ 完成后,进入控制台界面: 创建新应用 进入【应用管理】,点击页…...

安卓基础(startActivityForResult和onActivityResult)

onActivityResult 方法有三个参数: requestCode:启动 Activity 时传入的请求码,用于区分不同的启动请求。resultCode:返回结果的状态码,通常为 RESULT_OK 或 RESULT_CANCELED。data:一个 Intent 对象&…...

安卓基础(悬浮窗)

悬浮窗 import android.app.Service; import android.content.Context; import android.graphics.PixelFormat; import android.os.IBinder; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager…...

《windows GCC 版本升级到9以上》

《windows GCC 版本升级到9以上》 在 Windows 系统上升级 GCC 到 9 以上版本通常有两种主流方案:MinGW-w64 和 WSL(Windows Subsystem for Linux)。以下是具体操作步骤: 方案一:使用 MinGW-w64(原生 Windows 环境) 步骤 1:安装 MSYS2 MSYS2 是 Windows 上的软件分发…...

LeetCode —— 102. 二叉树的层序遍历

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…...

Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)

摘要:本文介绍面向对象编程基础概念,包括类与对象、封装、继承和多态等。以Python语言为例,详细讲述了类的定义与使用、构造函数与析构函数、类的访问控制等。面向对象编程通过将数据和操作封装在一起,提高代码的模块化和可维护性…...

【AI论文】DeepCritic:使用大型语言模型进行有意识的批判

摘要:随着大型语言模型(LLMs)的快速发展,对其输出提供准确的反馈和可扩展的监督成为一个紧迫而关键的问题。 利用LLM作为评判模型来实现自动化监督是一种有前景的解决方案。 在这项工作中,我们专注于研究和提高LLM的数…...

硬件工程师面试常见问题(12)

第五十六问:PCI总线基本知识 关于PCI总线的描述,错误的是:(A)(4分) A.PCI总线是一个16位宽的总线。 B.PCI的地址线与数据线是复用的。 C.PCI是一种独立于处理器的总线标准,可以支持多种处理器。 D.PCI支持即插即用功能。 解释: …...

大数据Spark(五十八):Spark Pi介绍

文章目录 Spark Pi介绍 Spark Pi介绍 Spark Pi是Apache Spark官方提供的一个示例程序,该案例使用 Spark 进行分布式计算,通过蒙特卡罗方法估算圆周率(π)的值,其估算π原理如下: 上图中,正方形…...

深入理解 HttpExchange_Java 中构建 HTTP 服务的基础组件

1. 引言 1.1 Java 中的轻量级 HTTP 服务需求 随着微服务、工具类应用和嵌入式系统的兴起,开发者对轻量级 HTTP 服务的需求日益增长。相比引入庞大的框架(如 Spring Boot),使用 JDK 原生 API 构建 HTTP 服务成为一种快速、低依赖的替代方案。 JDK 提供了 com.sun.net.htt…...

MaC QT 槽函数和Lambda表达式

在C Qt框架中&#xff0c;槽函数&#xff08;Slot&#xff09;是一种特殊的成员函数&#xff0c;用于响应信号&#xff08;Signal&#xff09;的触发&#xff0c;从而实现对象间的通信和事件处理。 #include<QMessageBox>//包含槽函数的头文件 //定义槽函数 响应特定的信…...

JMM 与 JVM 运行时数据区有什么区别和联系?

JMM&#xff08;Java Memory Model&#xff09;和 JVM 运行时数据区&#xff08;JVM Runtime Data Areas&#xff09;是 Java 内存管理中的两个不同但密切相关的概念。 1. JVM 运行时数据区 (JVM Runtime Data Areas) 是什么&#xff1f; JVM 运行时数据区是 JVM 在程序执行过程…...

LeetCode Hot100题解

目录 一、数组 & 字符串 1. 两数之和&#xff08;简单&#xff09; 2. 删除有序数组中的重复项&#xff08;简单&#xff09; 3. 移除元素&#xff08;简单&#xff09; 4. 合并两个有序数组&#xff08;简单&#xff09; 5. 买卖股票的最佳时机&#xff08;简单&…...

基于Jenkins的DevOps工程实践之Jenkins共享库

文章目录 前言Jenkins共享库结构1、共享库演示2、知识点补充3、实践使用共享库格式化输出日志4、groovy基础语法4.1、 什么是 Groovy&#xff1f;4.2、groovy特点4.3、运行方法4.4、标识符4.5、基本数据类型4.5.1、string类型4.5.2、list类型 4.6、函数使用4.7、正则表达式 5、…...

【安装指南】Docker 安装最新版 Nginx 并进行项目的编排

目录 一、Nginx 的介绍 1.1 开源版 Nginx​ ① 访问路由​ ② 反向代理​ ③ 负载均衡​ ④ 内容缓存​ ⑤ 可编程​ 1.2 商业版 Nginx Plus​ ① 负载均衡​ ② 动态管理​ ③ 安全控制​ ④ 状态监控​ ⑤ Kubernetes Ingress Controller​ ⑥ 流媒体​ 1.3 扩…...

MFC自定义控件开发与使用指南

MFC自定义控件开发与使用指南 1. 概述 MFC(Microsoft Foundation Classes)框架提供了丰富的内置控件,但在实际开发中,我们常常需要创建自定义控件来满足特定的界面需求。本文将详细介绍如何在MFC中开发自定义控件,并以CCustomTextControl为例,展示自定义控件的实现和使…...

Learning vtkjs之PolyDataNormals

法线可视化 介绍 polydata法线可视化 效果 核心代码 主要流程 const fullScreenRenderer vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerRef.current,});const renderer fullScreenRenderer.getRenderer();const renderWind…...

DeepSeek辅助学术写作之提交和出版以及评审过程分析提示词分享祝你顺利毕业~

目录 1.提交和出版 2.评审过程 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 宝子们可以使用小编精选的“ChatGPT研究论文提示词”集合来创建研究论文。利用DeepSeek的智能回应生成详尽有效的内容&#xff0c;这样可以加快研究论文的策划、创…...

基于机器学习的心脏病数据分析与可视化(百度智能云千帆AI+DeepSeek人工智能+机器学习)健康预测、风险评估与数据可视化 健康管理平台 数据分析与处理

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

Kubernetes(k8s)学习笔记(四)--入门基本操作

本文通过kubernetes部署tomcat集群&#xff0c;来学习和掌握kubernetes的一些入门基本操作 前提条件 1.各个节点处于Ready状态&#xff1b; 2.配置好docker镜像库(否则会出现ImagePullBackOff等一些问题)&#xff1b; 3.网络配置正常(否则即使应用发布没问题&#xff0c;浏…...

在Java项目中实现本地语音识别与热点检测,并集成阿里云智能语音服务

引言 随着语音交互技术的发展&#xff0c;如何高效地处理用户的语音输入成为许多应用的重要课题。本文将详细介绍如何在一个Java项目中同时实现&#xff1a; 基于Vosk的本地语音识别&#xff1a;无需调用云端API即可完成语音到文本的转换。本地热点语音内容识别&#xff1a;对…...

C++八股--5--设计模式--适配器模式,代理模式,观察者模式

3. 观察者模式&#xff08;也叫做观察者-监听者模式&#xff0c;发布-订阅模式&#xff09; 主要关注对象的一对多关系&#xff0c;也就是多个对象都依赖于一个对象&#xff0c;当该对象状态改变时&#xff0c;其余对象都能得到对应的通知 如&#xff1a;一组数据&#xff08;数…...

Ubuntu下安装Node.js

一、引言 Ubuntu下安装Node.js主要有两种方式&#xff1a;通过apt安装和通过源码安装。本文主要讲解通过apt安装Node.js的方法。 二、通过apt安装Node.js 安装Node.js&#xff1a; apt install nodejs 我之前已经安装过了&#xff0c;所以提示&#xff1a;“nodejs 已经是最…...

用单目相机和apriltag二维码aruco实现单目定位

目录 一、核心流程与代码框架 1. ‌环境准备‌ 2. ‌ArUco定位实现 3. ‌AprilTag定位实现&#xff08;需额外安装Apriltag库&#xff09; 二、关键优化点 1‌.亚像素角点优化 2‌ 多标签联合定位 三、性能指标&#xff08;实测&#xff09; 四、常见问题 ‌检测失败…...

AIGC算力消耗白皮书:Stable Diffusion vs Midjourney的架构成本差异

引言&#xff1a;文生图模型的算力经济学悖论 当Midjourney单日处理超过4000万张图像请求时&#xff0c;其云服务算力成本却低于Stable Diffusion开源方案的37%。这揭示了一个核心矛盾&#xff1a;开源模型的架构自由度与闭源系统的商业优化之间存在根本性博弈。本文基于H800 …...

介绍 PHP-FPM 和 Python WSGI

我来详细介绍 PHP-FPM 和 Python WSGI&#xff0c;它们是现代Web开发中替代传统CGI的高性能解决方案&#xff0c;分别针对PHP和Python优化。 1. PHP-FPM&#xff08;FastCGI Process Manager&#xff09; 是什么&#xff1f; PHP-FPM 是PHP的 FastCGI 进程管理器&#xff0c;…...

赛季7靶场 -- Checker --User flag

本系列仅说明靶场的攻击思路&#xff0c;不会给出任何的详细代码执行步骤&#xff0c;因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。root要逆向&#xff0c;没做了&#xff0c;但是user flag也有借鉴意义&#xff0c;关于2FA的绕过我们有必要了解 1.首先Nmap扫描…...

【c语言】数据在内存中的存储

一、 大小端字节序 大端字节序&#xff1a;数据的低字节内容存放在内存的高地址处&#xff0c;数据的高字节内容存放在内存的低地址处&#xff0c;对于0x11223344 小端字节序&#xff1a;数据的低字节内容存放在内存的低地址处&#xff0c;数据的高字节内容存放在内存的高地…...

【Unity】XLua访问C#文件

创建NPC.cs&#xff1a; public class NPC { public string name; public int age; public void Say() { Debug.Log("Say:我是未被修改的"); } public static void Say() { Debug.Log("Static Say:我是未被修改的"); } public void Say2(int a) { Debug.Lo…...

Python实例题:Python获取房天下数据

目录 Python实例题 题目 实现思路 代码实现 代码解释 get_fangtianxia_data 函数&#xff1a; 主程序&#xff1a; 运行思路 注意事项 Python实例题 题目 Python获取房天下数据 实现思路 请求网页&#xff1a;使用 requests 库向房天下二手房页面发送请求&#xf…...

Milvus(12):分析器

1 分析器概述 在文本处理中&#xff0c;分析器是将原始文本转换为结构化可搜索格式的关键组件。每个分析器通常由两个核心部件组成&#xff1a;标记器和过滤器。它们共同将输入文本转换为标记&#xff0c;完善这些标记&#xff0c;并为高效索引和检索做好准备。 在 Milvus 中&a…...

小程序滚动条隐藏(uniapp版本)

单独指定页面隐藏&#xff08;找到对应的scroll-view&#xff09; <style> /* 全局隐藏滚动条样式 */ ::-webkit-scrollbar { display: none; width: 0; height: 0; color: transparent; background: transparent; } /* 确保scroll-view组件也隐藏滚动条 */ …...

在 Trae CN IDE 中配置 Python 3.11的指南

在 Trae CN IDE 中配置 Python 3.11的指南 下载 python 3.11 安装 Python 3.11 首先&#xff0c;我们需要确保安装了 Python 3.11。可以从Python 官方网站下载适合你操作系统的版本。 链接 如果你已经安装了 Python 3.11&#xff0c;可以通过以下命令确认&#xff1a; 文…...

AI 大模型常见面试题(及内容解析)

大模型领域包含许多专业术语&#xff0c;以下是一些关键术语的解释&#xff1a; 人工智能&#xff08;AI&#xff09;&#xff1a;是指使计算机系统能够模拟人类智能行为&#xff0c;以执行任务、解决问题和学习的科学和技术。 大型语言模型&#xff08;LLM&#xff09;&#…...

QT —— QWidget(1)

QT —— QWidget&#xff08;1&#xff09; QWidget是啥通俗解释&#xff1a;QWidget 是什么&#xff1f;1. QWidget 能干什么&#xff1f;2. 举个栗子 &#x1f330;3. QWidget 的特点4. 和“控件”是什么关系&#xff1f;5. 什么时候用 QWidget&#xff1f;6. 总结 QWidget 核…...

with的用法

Python SQLite 操作详解 本文档详细解释了使用 Python 操作 SQLite 数据库时涉及的关键概念和代码实践&#xff0c;包括 with 语句、事务处理、批量插入以及相关的优化建议。 一、with 语句的作用&#xff08;自动关门的保险库&#xff09; with sqlite3.connect(city_1301.d…...

Go反射-通过反射调用结构体的方法(带入参)

使用反射前&#xff0c;我们需要提前做好映射配置 papckage_struct_relationship.go package reflectcommonimport (api "template/api" )// 包名到包对象的映射 var structMap map[string]func() interface{}{"template/api": func() interface{} { re…...

C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 19)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 二…...

使用 Selenium 爬取动态网页数据 —— 实战与坑点详解

本文记录了笔者在爬取网页数据过程中遇到的各种技术挑战&#xff0c;包括页面动态渲染、JavaScript 注入等问题&#xff0c;并最终给出一个可运行的完整方案。 文章目录 网页获取不到数据&#x1f680; 尝试用 Selenium 渲染页面 网页获取不到数据 某网页数据依赖大量 JavaSc…...

强化学习--2.数学

强化学习--数学 1、概率统计知识1.1 随机变量与观测值1.2 概率密度函数&#xff08;PDF&#xff09;1.3 期望1.4 随机抽样 2、数据期望E3、正态分布4、条件概率1. **与多个条件相关**&#xff08;依赖所有前置条件&#xff09;2. **仅与上一个条件相关**&#xff08;马尔可夫性…...

rails 8 CSS不起效问题解决

很久没用rails了&#xff0c;最近打算重新复习一下。在配置好环境后&#xff0c;创建了项目&#xff0c;通过脚手架创建了数据库表&#xff0c;和相关的文件。但我发现却没有生成相应的CSS文件&#xff0c;可能是rails8 取消了吧。于是自己手动创建了相应的css文件。但是刷新页…...