【UE4 C++基础系列】:

【视频教程】:

【导图】:

第一部分、DPI屏幕适配

一、SOverlay来做UI的布局。

【1.1】自定义SlateWidgetStyle.h中再添加一个SlateBrush以放置屏幕中央菜单背景图片

//FShitMenuStyle 即ShitMenuWidgetStyle样式中添加两个SlateBrush,存放图片。UPROPERTY(EditAnywhere,Category=MenuHUD)

FSlateBrush ShitMenuHUDBackGroundBrush;

UPROPERTY(EditAnywhere, Category = MenuHUD)

FSlateBrush ShitMenuBackGroundBrush;

【1.2】自定义HUDWidget.cpp中添加Overlay层并包含两图片

【1】Overlay小知识

首先介绍一下Overlay,简单来说,Overlay就相当于一个盒子,它可以像PS图层那样布置组件,图层最上面置底,最下面置顶,我们要用的就是它的多槽,对齐和Padding功能。

比如举个例子,比如说我们的Button,Button.Style.Image是会跟Button变的,我们如果要在Button周围添加些小图片、还要给Button里面添加文字就需要用到Overlay了,毕竟Button组件只有一个槽。

我们本节用它来作为基础层来加Widget(也就是没有Canvas Panel,直接Overlay作为底层上)

【2】代码实现

这个跟UMG做UI差不多啦,网页也是,C++代码属性名和UMG Widget属性名差不多,相互对应。SNew(SOverlay)——从Palette拽一个Overlay到Hierarchy层级

+SOverlay::Slot()——给Overlay Widget下面放东西,添加槽

.H/VAlign——如子组件的父层Slot(Overlay Slot) 对齐方式

[...]——给UI添加Image组件,然后把WidgetStyle.SlateBrush中存的图片添加到屏幕上

注意ChildSlot[];(分号结尾,常常加着加着就没了或忘了)

MenuStyle是从头文件来的。

const struct FShitMenuStyle* MenuStyle;

ChildSlot

[

SNew(SOverlay)

+SOverlay::Slot()

.HAlign(HAlign_Fill)

.VAlign(VAlign_Fill)

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuHUDBackGroundBrush)

]

+ SOverlay::Slot()

.HAlign(HAlign_Center)

.VAlign(VAlign_Center)

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuBackGroundBrush)

]

];//分号结尾

【1.3】ShitController源文件中把第一篇中的鼠标选项设置为不打锁。

自适应要拖动边框,所以Do Not Lock。

InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);

然后编译Build一下。

【1.4】可以自定义设置图片大小

因为我们【1.2】代码中已经定义了HUD背景图铺满屏幕、Menu菜单背景图居中。所以我们可以自定义设置Menu菜单背景图的图片大小,如20、20就是个小不点,我们需要使用图片的默认尺寸大小,所以黄色小箭头归零。(也可以在代码里写死,但在SlateWidgetStyle中调节我们是可以直接预览到变化的,而且后面不是要DPI适配嘛,所以不能代码中写死。)

二、DPI Scaling 屏幕自适应

【2.1】项目默认设置

在项目设置中进行设置,默认是这样的

【操作】全部删掉,只剩下屏幕尺寸(Resolution=xxx,Scale=1.0),我们马上要通过代码来自适应。

【知识点】:DPI Scale Rule ,默认是Shortest Rule 根据最短边来进行计算。

屏幕尺寸比例大多为16:9,所以按它来算:720:480

1280:720

1920:1080

3840:2160

大多屏幕都是1080P的,所以它是按照

的规则进行缩放的,4K的屏幕,就以2160作分母。

默认的是480就停了,也就是窗口到720*480的时候就不再进行自适应缩放了。可以看到下方屏幕宽度小于480以后背景图片都没了。

其实我们只需要加个(Res=0,Scale=0)的关键帧就行了,但是为了掌握 UE4 C++基础,还得啃一下代码,两种方法其实最终效果都一样。

我们在学习网页大数据展示的时候也遇到过屏幕适配知识,可以综合着一起学习应用程序、网页、手机APP的DPI相关知识点。

【2.2】代码设置

【头文件】:

我们再在自定义SlateWidget.h中添加如下:变量和函数的声明分开,便于分辨。

private:// 函数声明float GetUIScaler() const;

FVector2D GetViewportSize() const;

private: //变量声明TAttributeUIScaler;

【源文件】:

源文件Construct函数中:绑定缩放规则方法。

GetUIScaler方法我们会在下面实现。

UIScaler.Bind(this, &SShitMenuHUDWidget::GetUIScaler);

绑定一个任意函数,该函数将被调用来根据需要生成该属性的值。&——表示取函数返回的值

SShitMenuHUDWidget::GetUIScaler—— 调用本类中的函数

this——关键词表表示把逗号后面的值传给this绑定参数值

UIScaler.——然后把系数值给到float UIScaler变量方便下面SNew(SDPIScale)调用。

跟UMG中Widget组件这个Bind类似啦。

头文件 Alt+C 源文件函数实现GetUIScaler函数会先调用下面的GetViewportSize函数。

float SShitMenuHUDWidget::GetUIScaler() const

{

return GetViewportSize().Y / 2160.f; //4K}

FVector2D SShitMenuHUDWidget::GetViewportSize() const

{

FVector2D Result(3840, 2160);// 初始化声明自己的屏幕分辨率为4K。(根据自己的设置),给到Resultif (GEngine && GEngine->GameViewport)

GEngine->GameViewport->GetViewportSize(Result);//获取当前缩放比例return Result; //返回当前的屏幕尺寸}

三、SDPIScaler自适应类

【头文件】:UIScaler 头文件引入 SDPIScaler

#include "Widgets/Layout/SDPIScaler.h"

【源文件】:把Overlay包含在DPIScaler 里面。这样所有的Widget组件都会根据UIScaler的值来进行设定。

ChildSlot

[

SNew(SDPIScaler) //创建 SDPIScaler.DPIScale(UIScaler) //实例化并把UIScaler Ratio系数比比传给DPIScale。

[

SNew(SOverlay)

+ SOverlay::Slot()

.HAlign(HAlign_Fill)

.VAlign(VAlign_Fill)

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuHUDBackGroundBrush)

]

+ SOverlay::Slot()

.HAlign(HAlign_Center)

.VAlign(VAlign_Center)

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuBackGroundBrush)

]

]

];

然后屏幕自适应就OK了。(咦,那个灰框框竟然自己神奇地消失了~)

【头文件】:

// SShitMenuHUDWidget.h#pragma once

#include "CoreMinimal.h"#include "Widgets/SCompoundWidget.h"#include "Widgets/Images/SImage.h"

/****/

class TESTGAME_API SShitMenuHUDWidget : public SCompoundWidget

{

public:

SLATE_BEGIN_ARGS(SShitMenuHUDWidget)

{}

SLATE_END_ARGS()

/** Constructs this widget with InArgs */

void Construct(const FArguments& InArgs);

private:

float GetUIScaler() const;

FVector2D GetViewportSize() const;

private:

TAttributeUIScaler;

const struct FShitMenuStyle* MenuStyle;

};

【源文件】:

// SShitMenuHUDWidget.cpp

#include "UI/Widget/SShitMenuHUDWidget.h"#include "SlateOptMacros.h"#include "UI/Style/ShitStyle.h"#include "UI/Style/ShitMenuWidgetStyle.h"#include "Widgets/Layout/SDPIScaler.h"#include "Engine/Engine.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION

void SShitMenuHUDWidget::Construct(const FArguments& InArgs)

{

//获取编辑器的MenuStyleMenuStyle = &ShitStyle::Get().GetWidgetStyle("BPShitStyle");

UIScaler.Bind(this, &SShitMenuHUDWidget::GetUIScaler);

ChildSlot

[

SNew(SDPIScaler)

.DPIScale(UIScaler)

[

SNew(SOverlay)

+ SOverlay::Slot()

.HAlign(HAlign_Fill)

.VAlign(VAlign_Fill)

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuHUDBackGroundBrush)

]

+ SOverlay::Slot()

.HAlign(HAlign_Center)

.VAlign(VAlign_Center)

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuBackGroundBrush)

]

]

];

}

END_SLATE_FUNCTION_BUILD_OPTIMIZATION

float SShitMenuHUDWidget::GetUIScaler() const

{

return GetViewportSize().Y / 2160.f;

}

FVector2D SShitMenuHUDWidget::GetViewportSize() const

{

FVector2D Result(3840, 2160);// 初始化if (GEngine && GEngine->GameViewport)

GEngine->GameViewport->GetViewportSize(Result);//获取当前缩放比例return Result;

}

第二部分、菜单布局实现

一、Button事件检测布局

【蓝图方法】:

我们可以通过蓝图这种方法来调节Slot参数。

【代码方法】:

【头文件】:

我们需要通过代码来实现:SOverlay类下的FOverlaySlot类 给到ImageSlot对象指针。(FOverlaySlot类中包含了用到的Padding、HAlign、VAlign等)

FReply类管一些列鼠标相关的函数

private: //变量 SOverlay::FOverlaySlot * ImageSlot;

private://函数 FReply Onclick();

【源文件】:

【1】Expose(ImageSlot)Expose是SlotBase类中定义的(还有Attach、Detach、AttachParent等方法)

通过修改ImageSlot来修改Slot属性,给到那个Menu菜单栏图片(而不是背景图片哦)

+ SOverlay::Slot()

.HAlign(HAlign_Center)

.VAlign(VAlign_Center)

.Expose(ImageSlot) //添加语句[

SNew(SImage)

.Image(&MenuStyle->ShitMenuBackGroundBrush)

]

]

];

【2】实现OnClicked绑定函数先把头文件中声明的OnClick方法实现,Onclick被绑定函数让图片锁在Slot插槽的最右下角(编辑器WidgetStyle中改是不起效的)

Handled让系统知道事件处理了

FReply SShitMenuHUDWidget::OnClick()

{

ImageSlot->HAlign(HAlign_Right).VAlign(VAlign_Bottom);

return FReply::Handled();

}

【3】SButton绑定OnClick事件然后SButton绑定函数调用。(如果出不来那是因为你没有include)

注意总的ChildSlot[]; ( ]后面有个分号;,否则会报错 )

+ SOverlay::Slot()

.HAlign(HAlign_Left)

.VAlign(VAlign_Top)

[

SNew(SButton)

.OnClicked(this, &SShitMenuHUDWidget::OnClick)

]

二、背景大UI嵌入菜单中央小UI

我们之前都一直对SShitMenuHUDWidget进行操作的(我们暂且把它叫做背景UI),那个我们定义的是添加到屏幕上的。

然后我们在背景UI中先#include菜单UI。

#include "UI/Widget/SShitMenuWidget.h"

之后第三节中呢我们要对我们第一篇中创建的另外一个Widget叫做SShitMenuWidget(我们把它叫做菜单UI)进行操作。先把第一步中添加的代码先都删掉,那个Button是用来测试布局的。

【嵌入菜单UI】:

我们用SAssginNew方法来给UI,跟之前第一篇中的Button是一样的。另一种是我们常用的SNew

【头文件】:

声明菜单指针。

TSharedPtrMenuWidget;

【源文件】:把之前那个中央的图片替换成这个菜单UI。

+ SOverlay::Slot()

.HAlign(HAlign_Center)

.VAlign(VAlign_Center)

[

SAssignNew(MenuWidget,SShitMenuWidget)

]

我们把这个菜单UI嵌入到背景UI的中间那张图片上。

三、ShitMenuWidgetStyle.h 自定义WidgetStyle中配置足够图片

本篇内容中差不多共使用到5张。背景图片 1张

菜单背景图片 1张

菜单左右侧图片 2张

标题图片 1张

UPROPERTY(EditAnywhere,Category=MenuHUD)

FSlateBrush ShitMenuHUDBackGroundBrush;

UPROPERTY(EditAnywhere, Category = MenuHUD)

FSlateBrush ShitMenuBackGroundBrush;

UPROPERTY(EditAnywhere, Category = MenuHUD)

FSlateBrush LeftIconBrush;

UPROPERTY(EditAnywhere, Category = MenuHUD)

FSlateBrush RightIconBrush;

UPROPERTY(EditAnywhere, Category = MenuHUD)

FSlateBrush TitleBorderBrush;

四、定义菜单底图左右两侧图位置

开始定义菜单UI啦,我们先把做了三篇的背景UI先扔到一边。

【头文件】:conststructFShitMenuStyle* MenuStyle;——声明指针对象,方便源文件中获取图片的地址

TSharedPtrRootSizeBox;——声明Scale Box指针,以定义ScaleBox大小。

// SShitMenuWidget.h#pragma once#include "CoreMinimal.h"#include "Widgets/SCompoundWidget.h"

/****/

class TESTGAME_API SShitMenuWidget : public SCompoundWidget

{

public:

SLATE_BEGIN_ARGS(SShitMenuWidget)

{}

SLATE_END_ARGS()

/** Constructs this widget with InArgs */

void Construct(const FArguments& InArgs);

private:

const struct FShitMenuStyle * MenuStyle;

TSharedPtrRootSizeBox;

};

【源文件】:

记得包含头文件#include"Widgets/Layout/SBox.h ——ScaleBox,它可以自定义设置Width和Height

#include"UI/Style/ShitStyle.h ——以调用空类中方法

#include"UI/Style/ShitMenuWidgetStyle.h——把那个自定义WidgetStyle拿过来

Padding就是边距,FMargin设置值。 50.f即距离上方50px。

MenuStyle = &ShitStyle::Get().GetWidgetStyle("BPShitStyle");

ChildSlot

[

SAssignNew(RootSizeBox, SBox)

[

SNew(SOverlay) //创建Overlay 组件

+ SOverlay::Slot() //添加菜单背景底图.HAlign(HAlign_Fill)//铺满.VAlign(VAlign_Fill)

.Padding (FMargin(0.f, 50.f, 0.f, 0.f))

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuBackGroundBrush)

]

+SOverlay::Slot() //添加菜单左侧图.HAlign(HAlign_Left) //居左.VAlign(VAlign_Center)

.Padding(FMargin(0.f, 25.f, 0.f, 0.f))

[

SNew(SImage)

.Image(&MenuStyle->LeftIconBrush)

]

+ SOverlay::Slot() //添加菜单右侧图.HAlign(HAlign_Right) //居右.VAlign(VAlign_Center)

.Padding(FMargin(0.f, 25.f, 0.f, 0.f))

[

SNew(SImage)

.Image(&MenuStyle->RightIconBrush)

]

];

五、定义标题框框位置

【Border】:Slot(XXX)就是基于父级控制当前级

Content就是控制子级Border结合头文件中的共享指针 用SAssignNew的方法是因为我们需要特定这个外面大Box的尺寸。

ScaleBox长宽根据自己的屏幕分辨率来定。

ChildSlot

[

SAssignNew(RootSizeBox, SBox) //大菜单ScaleBox[

SNew(SOverlay) //Overlay层叠加 + SOverlay::Slot()

.HAlign(HAlign_Center)//标题框相对于大菜单居中.VAlign(VAlign_Top) //标题框相对于大菜单居上[

SNew(SBox) //居中居上的标框Box.WidthOverride(750.f) //标题框的宽度.HeightOverride(300.f) //标题框的高度[

SNew(SBorder)

.BorderImage(&MenuStyle->TitleBorderBrush) //给Border添加图片]

]

]

];

RootSizeBox->SetWidthOverride(1200.f); //设置大菜单宽度和高度RootSizeBox->SetHeightOverride(900.f);

这里我们用到了SBox和SBorder,所以同样头文件记得哦。

#include"Widgets/Layout/SBorder.h"#include"Widgets/Layout/SBox.h"

六、定义Text文字

【6.1】引用头文件

引入TextBlock,用到谁就引用谁。

#include "Components/TextBlock.h"

【6.2】头文件声明共享指针

因为我们会动态修改文字的内容,所以我们需要在MenuWidget头文件中把它定义成一个指针。然后SAssignNew啦。

TSharedPtrTitleText;

【6.3】ShitStyle空类中定义字体样式定义字体样式,浏览器搜索免费ttf字体下载即可。

然后把这个ttf字体样式导入到 “/Game/UI/Style"下面

还记得我们的ShitStyle嘛,就是注册注销,设置路径的那个空类。我们需要在里面设置字体路径。

我就直接用微软雅黑的了,导入Yes all,它会创建两个Microsoft(Font Face) (UI是AZ)——存ttf路径,Source Filename

Microsoft_Font(Font) (UI是黑色背景+白色字体样式)——一堆FontFamily,功能挺多的。

在空类源文件中 加一行代码StyleRef->Set("MenuItemFont", FSlateFontInfo("Microsoft.ttf",50));

TSharedRef ShitStyle::Create() //头文件函数声明TSharedPtr,源文件定义TSharedRef ,返回StyleRef。{

TSharedRefStyleRef = FSlateGameResources::New(ShitStyle::GetStyleSetName(), "/Game/UI/Style","/Game/UI/Style"); //调用本ShityStyle类中的GetStyleSetName函数

StyleRef->Set("MenuItemFont", FSlateFontInfo("Microsoft.ttf",50));

return StyleRef;

}

【6.4】:MenuWidget 中在小文字框内添加TextBlock

我们需要先引入#include"Components/TextBlock.h"。

+ SOverlay::Slot()

.HAlign(HAlign_Center)//标题框相对于大菜单居中.VAlign(VAlign_Top) //标题框相对于大菜单居上[

SNew(SBox) //居中居上的标框Box.WidthOverride(750.f) //标题框的宽度.HeightOverride(300.f) //标题框的高度[

SNew(SBorder)

.BorderImage(&MenuStyle->TitleBorderBrush) //给Border添加图片]

]

.HAlign(HAlign_Center)

.VAlign(VAlign_Center)

[

SAssignNew(TitleText, STextBlock) // 实例.Font(ShitStyle::Get().GetFontStyle("MenuItemFont")) //.Text(FText::FromString("I am 特斯拉"))

]

]

七、配置所需图片 检验测试

我们只需要设置左右图片的大小就好了,其他的大背景尺寸、菜单底图、文字框图都在代码中写死了。

另外:那个边角挺聪明的,四个朝向直接在PS中做好,要不然用代码来弄非常麻烦的,网页大数据的时候也遇到过。

我们下节再进行语言设置,还有处理文字乱码问题。

MenuWidget.h代码

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"#include "Widgets/SCompoundWidget.h"

/****/

class TESTGAME_API SShitMenuWidget : public SCompoundWidget

{

public:

SLATE_BEGIN_ARGS(SShitMenuWidget)

{}

SLATE_END_ARGS()

/** Constructs this widget with InArgs */

void Construct(const FArguments& InArgs);

private:

TSharedPtrRootSizeBox;

const struct FShitMenuStyle*MenuStyle;

TSharedPtrTitleText;

};

MenuWidget.cpp代码

// Fill out your copyright notice in the Description page of Project Settings.

#include "UI/Widget/SShitMenuWidget.h"#include "SlateOptMacros.h"

#include "Widgets/Layout/SBox.h"#include "Widgets/Images/SImage.h"#include "Widgets/Layout/SBorder.h"#include "Components/TextBlock.h"

#include "UI/Style/ShitStyle.h"#include "UI/Style/ShitMenuWidgetStyle.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION

void SShitMenuWidget::Construct(const FArguments& InArgs)

{

MenuStyle = &ShitStyle::Get().GetWidgetStyle("BPShitStyle");

ChildSlot

[

SAssignNew(RootSizeBox, SBox)

[

SNew(SOverlay)

+ SOverlay::Slot()

.HAlign(HAlign_Fill)

.VAlign(VAlign_Fill)

.Padding (FMargin(0.f, 50.f, 0.f, 0.f))

[

SNew(SImage)

.Image(&MenuStyle->ShitMenuBackGroundBrush)

]

+SOverlay::Slot()

.HAlign(HAlign_Left)

.VAlign(VAlign_Center)

.Padding(FMargin(0.f, 25.f, 0.f, 0.f))

[

SNew(SImage)

.Image(&MenuStyle->LeftIconBrush)

]

+ SOverlay::Slot()

.HAlign(HAlign_Right)

.VAlign(VAlign_Center)

.Padding(FMargin(0.f, 25.f, 0.f, 0.f))

[

SNew(SImage)

.Image(&MenuStyle->RightIconBrush)

]

+ SOverlay::Slot()

.HAlign(HAlign_Center)

.VAlign(VAlign_Top)

[

SNew(SBox)

.WidthOverride(750.f)

.HeightOverride(300.f)

[

SNew(SBorder)

.BorderImage(&MenuStyle->TitleBorderBrush)

.HAlign(HAlign_Center)

.VAlign(VAlign_Center)

[

SAssignNew(TitleText, STextBlock)

.Font(ShitStyle::Get().GetFontStyle("MenuItemFont"))

.Text(FText::FromString("I Love You"))

]

]

]

]

];

RootSizeBox->SetWidthOverride(1200.f);

RootSizeBox->SetHeightOverride(900.f);

}

END_SLATE_FUNCTION_BUILD_OPTIMIZATION

小技巧:Tab向右缩进

Shift+Tab向左缩进(差不多都一样,Blender Python IDE也是)

SOverlay::Slot()[]方括号末尾添加;分号断句后可快速对齐,然后删除即可。

编辑器中Compile貌似速度更快一些(在无大Bug,稍微改些代码的时候貌似这个更快)

(而且VS中那个unabled to delete dll啥的是需要Rebuild的,通常是Build省时间,如果那种情况 VS Rebuild不成功的话,就编辑器Compile,而不用像我第二篇中提到的关闭重启了)

ue4设置图片大小_【UE4】C++基础【04】DPI屏幕适配/菜单布局相关推荐

  1. ue4设置图片大小_如何达成照片级渲染效果,UE4来助你一臂之力

    原标题:如何达成照片级渲染效果,UE4来助你一臂之力 silujy:Lasse Rode在探求使用实时渲染工具表现照片级场景的过程中,利用虚幻引擎做了一些颇为有益的尝试.表现对象则是一间唯美的,几乎是 ...

  2. markdown如何设置图片大小_不会吧,还不会用markdown排版吗

    请使用 Chrome 浏览器. 请阅读下方文本熟悉工具使用方法,本文可直接拷贝到微信中预览. 1 Markdown Nice 简介 支持自定义样式的 Markdown 编辑器 支持微信公众号.知乎和稀 ...

  3. ue4 设置打包名称_[UE4]工程打包时添加自定义文件 - 纳金网

    Project Settings -> packaging -> Packaging选项中,有多个设置项来设置打包时要排除或者包含的文件夹,比如:设置哪些目录不参与cook,以及哪些目录在 ...

  4. word 批量设置图片大小

    word批量修改图片大小--固定长宽篇 方法一: 这部分要说的是把word中的所有图片修改成固定的并且相同的长和宽! 1.打开word,工具-宏-宏(或者直接按Alt+F8)进入宏的 界面,如下面所示 ...

  5. C# 操作word 指定书签位置插入图片并设置图片大小和位置

    object Nothing = System.Reflection.Missing.Value;         //创建一个名为wordApp的组件对象         Application w ...

  6. java 在线给word 文件插入图片,并设置图片大小

    一.前言: 有时我们想在一篇word文档中的指定位置添加一张服务器上的图片,并且并且设置图片大小.这个对文档的操作一定是需要第三方api的.市面上对文档处理的插件有POI以及openoffice等等, ...

  7. 视频直播源码,插入图片、删除图片、设置图片大小、提取图片

    视频直播源码,插入图片.删除图片.设置图片大小.提取图片 1.插入图片 Document对象有一个add_paragraph()方法插入图片,只需要传入路径或者字节流即可,实际上它也是调用段落的Run ...

  8. visio设置图片默认大小_学习PS第6课(图片大小设置)

    最近这段时间更新手绘比较多,接下来继续更新一下ps小知识. 最近有人问我,寸照.照片.或者报名 (教师资格证.考试等) 用的照片,怎么按照给的要求调整图片的大小,或者说是限制在( ?)KB 或者( ? ...

  9. python批量resize图片大小_如何用Python智能批量压缩图片?

    本文一步步为你介绍,如何用Python自动判断多张图片中哪些超出阈值需要压缩,且保持宽高比.如果你想了解Python图像处理的基础知识,欢迎动手来尝试. 痛点 我喜欢用Markdown写文稿,然后发布 ...

  10. Python设置画布大小_我用Python的Seaborn库绘制17个超好看图表

    点击上方" Python爬虫与数据挖掘 ",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 风朝露夜阴晴里,万户千门开闭时 ...

最新文章

  1. 区块链技术特点之去中心化特性
  2. android 固定底部导航,Android如何实现底部菜单固定到底部
  3. java导入excel 实例_Java数据导入功能之读取Excel文件实例
  4. Java读取word文件,字体,颜色
  5. NLP快速入门:手把手教你用HanLP做中文分词
  6. mybatis学习(30):修改功能
  7. 爬虫--Scrapy-CrawlSpider基于CrawlSpide的分布式爬虫
  8. 云主机前景几何,风萧萧兮!
  9. truffle Migration是什么
  10. win10系统如何安装Oracle 10G
  11. pyhon中安装win32com模块
  12. 电脑计算机 系统制造方法是,如何制作车载计算机系统
  13. 微信小程序 服务通知之订阅消息授权公共方法
  14. 文件夹或文件的隐藏和加密20201024
  15. PCB生成BOM表、网络表添加logo并且输出为Gerber文件
  16. java中List 的Stream常用的几种用法
  17. C语言心语,心语,心缘
  18. faker.js生成手机号
  19. 推荐系统----GCN和NGCF, LightGCN实验结果对比
  20. UrlRewrite---实现url伪静态化

热门文章

  1. mysql磁盘空间碎片回收
  2. JS逻辑运算符的与,或,非
  3. 记账小程序 微信小程序 源码 uniapp vue3
  4. 生活中的逻辑谬误06.德克萨斯神枪手
  5. html显示tif图片,呈现HTML中的TIF文件
  6. 小三角箭头向下向上查看隐藏的效果 vue
  7. Echarts模板(五):树状图
  8. 台达plc ec3程序下载通讯设置_【台达PLC】入门这样学!基础详解!
  9. python :tushare 唐奇安通道
  10. Air202学习 三 (模块串口使用)