Android截屏、录屏工具

Android截屏、录屏工具,第1张

有时候会用到颜色拾取器这样的东西来查看屏幕上的颜色值,一直是用Pixolor这个软件来看颜色的;很方便,点哪里显示哪里,也没有延迟,以为是什么黑科技;我注意到一个细节,如果只是切换屏幕,颜色拾取器不会更新,只有移动拾取器才更新选中;可以确定是截屏来实现的了,那就简单了,截屏获取像素点的颜色值就好了

网上看了一下,截屏大概分为保存View为图像和调用录屏服务两种办法,录屏是比较好的办法,可以在APP外截屏,所以简单的封装了一下

Step 1 Add the JitPack repository to your build file

Step 2 Add the dependency

主要分为两步,第一步是开启录屏;第二步就可以直接获取截屏,返回Bitmap

截图的过程录屏是开启的,录屏开启就可以进行截屏, *** 作完需要关闭录屏

截屏过程很快,效果很好

如果是APP外截屏则开启悬浮窗服务,可以通过 *** 作悬浮窗进行截屏

参考文章: Android 截屏方式整理 、 Android录屏(50+)

1初始化一个 MediaProjectionManager

2创建并启动 Intent

3在 onActivityResult 中拿到MediaProjection

4设置VirtualDisplay将图像和展示的View关联起来。一般来说我们会将图像展示到SurfaceView,这里为了为了便于拿到截图,我们使用ImageReader,他内置有SurfaceView。

5通过ImageReader拿到截图

6注意截屏之后要及时关闭VirtualDisplay ,因为VirtualDisplay 是十分消耗内存和电量的。

录屏和截屏差不多,只是截屏的时候只是设置了一个ImageReader去获取图像数据,而录屏是设置一个 SurfaceView 去接收内容,获取视频流,然后通过 MediaCodec 来实现视频的硬编码,然后保存为视频文件

初始化录屏的大小和码率

开始录屏,设置输出文件

停止录屏

参考文章: Android视频录制--屏幕录制

1在 AndroidManifest 中添加权限,Android 60 加入的动态权限申请,如果应用的 targetSdkVersion 是 23,申请敏感权限还需要动态申请

中间 *** 作和截屏一样,就是准备开启录屏

5创建虚拟屏幕,这一步就是通过 MediaProject 录制屏幕的关键所在, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR 参数是指创建屏幕镜像,所以我们实际录制内容的是屏幕镜像,但内容和实际屏幕是一样的,并且这里我们把 VirtualDisplay 的渲染目标 Surface 设置为 MediaRecorder 的 getSurface ,后面我就可以通过 MediaRecorder 将屏幕内容录制下来,并且存成 video 文件

6录制屏幕数据,这里利用 MediaRecord 将屏幕内容保存下来

像素:指数码照相机的感光元件的点阵数手机上带的照相机,数码DV机,都有这个参数通常像素越大,则拍出来的相片越清晰(如果你指的确实是"屏幕像素",那么它就是指屏幕分辨率,与你后面提到的分辨率一词是相同的)

屏幕颜色:指屏幕上每一个最小的发光点所能发出的不同颜色数量这个数量越大,表示屏幕所能表现的色彩就越丰富,不同的色彩之间过渡的效果越平滑

分辨率:手机屏幕分辨率,指手机上液晶屏的发光点行数与列数量,如320X240,则是指竖向有320行,横向有240列通常这个分辨率越高,屏幕尺寸也会越大但是有些不同的屏幕分辨率相同,尺寸却不同,那是因为不同的液晶屏上发光点的面积大小不一样

调整方法如下:

1,打开控制面板,然后找到“外观和个性”。

2,进入“调整屏幕分辨率”。

3,进入后,选择“高级设置”。

4,找到颜色管理选项卡。

5,进入颜色管理,并打开高级选项。

6,打开菜单下部的校准显示器。

7,根据提示完成显示颜色的校正即可。

屏幕分辨率是指屏幕显示的分辨率。屏幕分辨率确定计算机屏幕上显示多少信息的设置,以水平和垂直像素来衡量。屏幕分辨率低时(例如 640 x 480),在屏幕上显示的像素少,但尺寸比较大。屏幕分辨率高时(例如 1600 x 1200),在屏幕上显示的像素多,但尺寸比较小。

显示分辨率就是屏幕上显示的像素个数,分辨率160×128的意思是水平方向含有像素数为160个,垂直方向像素数128个。屏幕尺寸一样的情况下,分辨率越高,显示效果就越精细和细腻。

/

主要是对 PictureBox 的 *** 作

截取屏幕图像

获取屏幕指定像素颜色

旋转和翻转

虚拟选择框绘制

控件绘图

为了方便,所有步骤在一个方法中完成

创建了一个新的 Form 对象

在该 Form 中添加了一个 PictureBox 对象

/

// 在 Form_Load 中调用

private void CSDNSample_PictureBoxHandle()

{

// 复制屏幕,创建原始

Bitmap image = new Bitmap(

ScreenPrimaryScreenBoundsWidth,

ScreenPrimaryScreenBoundsHeight);

using (Graphics g = GraphicsFromImage(image))

{

gCopyFromScreen(

0, 0, 0, 0,

imageSize,

CopyPixelOperationSourceCopy);

gSave();

}

// 创建 PictureBox 对象

PictureBox box = new PictureBox();

boxLocation = new Point(0, 0);

boxSizeMode = PictureBoxSizeModeStretchImage;

boxSize = imageSize;

boxImage = image;

// 创建 Form 对象

Form f = new Form();

fAutoScroll = true; // 自动滚动

fSize = new Size(800, 600);

// From_FormClosed 用于释放资源

fFormClosed += (sender, e) => { imageDispose(); };

// From_MouseWheel 用于缩放

// 由于滚动条和缩放同时进行 会有点不爽

// 建议右键菜单或 Control/Shift/Alt + 鼠标滚轮组合实现

fMouseWheel += (sender, e) =>

{

if (eDelta > 0)

{

// 限制放大效果 600% 以内

if (boxWidth / imageWidth < 6)

{

boxSize = new Size(

(int)(boxWidth 11),

(int)(boxHeight 11));

}

}

else

{

// 限制缩小效果 15% 以内

if ((float)boxWidth / (float)imageWidth > 015f)

{

boxSize = new Size(

(int)(boxWidth 09),

(int)(boxHeight 09));

}

}

};

// 用于记录鼠标按下时的位置

Point pt = PointEmpty;

// PictureBox_MouseDown 用于记录鼠标位置 绘制屏幕十字标记

boxMouseDown += (sender, e) =>

{

if (eButton == MouseButtonsLeft)

{

pt = eLocation;

// CursorPosition 获取全局鼠标位置(屏幕位置)

// CopyFromScreen 拷贝 1 个屏幕像素并生成

// BitmapGetPixel 获取上指定像素的颜色

using (Bitmap bitmap = new Bitmap(1, 1))

{

using (Graphics g = GraphicsFromImage(bitmap))

{

gCopyFromScreen(

CursorPositionX, CursorPositionY, 0, 0,

bitmapSize, CopyPixelOperationSourceCopy);

gSave();

}

// 设置窗口文本

// 显示鼠标当前位置和鼠标位置的像素颜色

Color color = bitmapGetPixel(0, 0);

fText = stringFormat("Pos: {0}, Color: {1}",

eLocation, color);

}

using (Graphics g = GraphicsFromHwnd(boxHandle))

{

using (Pen p = new Pen(ColorIndianRed, 3))

{

gDrawLine( // 画十字图形的 X 轴

p, new Point(eX - 10, eY), new Point(eX + 10, eY));

gDrawLine( // 画十字图形的 Y 轴

p, new Point(eX, eY - 10), new Point(eX, eY + 10));

}

}

}

};

// PictureBox_MouseUp 用于清除鼠标位置信息和屏幕十字标记

boxMouseUp += (sender, e) =>

{

if (eButton == MouseButtonsLeft)

{

pt = PointEmpty;

boxRefresh();

}

};

// PictureBox_MouseMove 用于绘制选择框

boxMouseMove += (sender, e) =>

{

// 设置窗口文本 显示鼠标当前位置

fText = stringFormat("Pos: {0}", eLocation);

if (eButton == MouseButtonsLeft && pt != PointEmpty)

{

using (Graphics g = GraphicsFromHwnd(boxHandle))

{

using (Pen p = new Pen(ColorIndianRed, 1))

{

// pt1 用于判断鼠标是否离开了 PictureBox

// 如果离开则重设 pt1

// 如此可保证被绘制的矩形一定出现在 PictureBox 中

Point pt1 = eLocation;

if (pt1X < 0) pt1X = 0;

if (pt1Y < 0) pt1Y = 0;

if (pt1X > boxWidth - 1) pt1X = boxWidth - 1;

if (pt1Y > boxHeight - 1) pt1Y = boxHeight - 1;

boxRefresh(); // 不刷新的话 会出现N个矩形

pDashStyle = SystemDrawingDrawing2DDashStyleDash;

gDrawPolygon(p, new Point[] {

pt,

new Point (pt1X, ptY),

pt1,

new Point(ptX, pt1Y) });

}

}

}

};

// 记录当前翻转样式

int rotate = 0;

// PictureBox_MouseDoubleClick 用于翻转

boxMouseDoubleClick += (sender, e) =>

{

if (eButton == MouseButtonsLeft)

{

// 由于是对 PictureBox 进行的 *** 作

// 只是进行了翻转,但大小未变

// 所以需要通过的某个边判断

// 是否因翻转而导致 Width / Height 互换

int imgWidth = boxImageWidth;

boxImageRotateFlip((RotateFlipType)rotate);

if (++rotate > 7) rotate = 0;

if (imgWidth == boxImageWidth) return;

boxSize = new Size(boxHeight, boxWidth);

}

};

fControlsAdd(box);

fShow();

}

以上就是关于Android截屏、录屏工具全部的内容,包括:Android截屏、录屏工具、经常在手机介绍的文章里看到的屏幕像素,屏幕颜色,分辨率都是什么有什么区别与联系、怎么调节电脑 屏幕的颜色(过滤掉蓝光),使其不伤眼等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9311714.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存