goodnotes图片改变透明度,设置图片的透明度从左到右渐变

您所在的位置:网站首页 goodnotes怎么导入多个图片 goodnotes图片改变透明度,设置图片的透明度从左到右渐变

goodnotes图片改变透明度,设置图片的透明度从左到右渐变

2024-07-05 08:04| 来源: 网络整理| 查看: 265

温馨提示:这篇文章已超过377天没有更新,请注意相关的内容是否还可用!

本文主要介绍使用 Windows 系统自带的“画图 3D”应用程序将图片背景设置为透明的具体方法。

1 需要的应用程序

Windows10 操作系统自带的“画图 3D”应用程序,如下图所示:

2 方法介绍

现有一张背景图为蓝色的 png 格式图片,如下图所示:

下面介绍将该图片的背景设置为透明的方法。

1. 使用“画图 3D”应用程序打开该图片;

2. 在“画图 3D”界面中,点击“神奇选择”按钮(该操作默认会选择整个图片);

3. 点击界面右侧的“下一步”;

4. 选择界面右侧的“删除”图标,然后去勾选“自动填充背景”选项,如下图所示:

5. 点击上图中的“已完成”按钮,此时就会生成图片内容与背景分离的视图,如下图所示:

6. 点击上图中的“画布”按钮,之后关闭界面右侧的“显示画布”开关,完成此操作后,会得到无画布的图片,如下图所示:

7. 通过“菜单”->“另存为”->“图像”功能,得到待保存的图片,如下图所示:

8. (可选)此时可以根据实际需求,点击上图中的“调整角度和框架”来调整图片大小。例如,如果需要正方形图片,则可以将框架比例设置为“1:1”,如下图所示:

完成上图中的设置后,点击图中的“确定”按钮,回到第7步的待保存图片界面中。

9. 勾选界面右侧的“透明度”选项,如下图所示:

点击上图界面右侧下方的“保存”按钮,即可得到背景透明的图片了,如下图所示:

在上图中,“before.png”是背景为蓝色的原始图片,“after.png”是对应的背景透明的图片。

至此,背景透明的图片就制作完成了。

最后,为了对比背景透明图片与原始图片的区别(或者说验证修改后的图片是否确实为背景透明的),可以使用“截图和草图”应用程序分别打开这两张图片。使用“截图和草图”打开的两张图片内容如下图所示:

通过上图内容可知,本文示例中生成的图片确实是背景透明的。

3 特殊说明

有些情况下,我们想让图片中的主体内容(如本文示例中的“派大星”)尽量占有图片的更多空间,即让图片中的主体内容更“大”一些,那么,有一种方法可以满足此需求。

回到本文第二章的第6步,完成关闭“显示画布”操作后,取消“画图 3D”应用程序最大化效果,然后通过调节“画图 3D”应用程序界面大小,来调整最终生成的背景透明图片中主体内容所占比例,如下图所示:

通过上图内容可知,图片主体内容“派大星”占据图片总体的比例明显提高了。

接下来的操作参考第二章的相关步骤即可,最终生成的背景透明的图片“after2.png”与第二章生成的“after.png”对比图,如下图所示:

在上图中可以看到,“after2.png”中的主体内容明显大于“after.png”中的对应内容。

最后,提醒大家,我们也可以通过调整原始图片(即“before.png”)中主体内容所占比例,来间接调整最终生成的背景透明图片中主体内容所占比例,大家可以根据实际情况灵活运用这些方法。

一、设置图片的透明度从左到右渐变

/**

* 设置图片的透明度从左到右渐变,使右边缘平滑过渡(注意只跟着x坐标变)

*

* @param num 范围为0-100,0为全透明,100为不透明

*/

public static Bitmap getTransAlphaBitmap(Bitmap sourceImg, float num) {

if (sourceImg == null) {

return null;

}

int width = sourceImg.getWidth();

int height = sourceImg.getHeight();

int[] bitArr = new int[width * height];

sourceImg.getPixels(bitArr, 0, width, 0, 0, width, height);

float number = num;

int start = width / DEFAULT_PERCENT;

float range = width - start;

try {

float step = (number * 1.0f) / range;

for (int j = 0; j

number = num;

for (int i = start + j * width; i

number = number - step;

float alpha = number * ALPAH_FULL / NUMBER_FULL;

bitArr[i] = ((int) alpha

}

}

return Bitmap.createBitmap(bitArr, width, height, Bitmap.Config.ARGB_8888);

} catch (Throwable e) {

return sourceImg;

}

}

二、设置图片的透明度从上到下渐变

/**

* 设置图片的透明度从上到下渐变,使下边缘平滑过渡(注意只跟着Y坐标变)

*

* @param sourceImg

* @return

*/

public static Bitmap getTransAlphaBitmap(Bitmap sourceImg) {

int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];

sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0, sourceImg

.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值

//number的范围为0-100,0为全透明,100为不透明

float number = 100;

//透明度数值

float alpha = number * 255 / 100;

//图片渐变的范围(只设置图片一半范围由上到下渐变,上面不渐变,即接近边缘的那一半)

float range = sourceImg.getHeight() / 2.0f;

//透明度渐变梯度,每次随着Y坐标改变的量,因为最终在边缘处要变为0

float pos = (number * 1.0f) / range;

//循环开始的下标,设置从什么时候开始改变

int start = sourceImg.getWidth() * (sourceImg.getHeight() - (int) range);

for (int i = start; i

//同一行alpha数值不改变,因为是随着Y坐标从上到下改变的

if (i % sourceImg.getWidth() == 0) {

number = number - pos;

alpha = number * 255 / 100;

}

argb[i] = ((int) alpha

}

sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg

.getHeight(), Bitmap.Config.ARGB_8888);

return sourceImg;

}

关于变换

在Glide中,Transformations 可以获取资源并修改它,然后返回被修改后的资源。通常变换操作是用来完成剪裁或对位图应用过滤器,但它也可以用于转换GIF动画,甚至自定义的资源类型。

内置类型

Glide 提供了很多内置的变换,包括:

CenterCrop FitCenter CircleCrop

应用

通过 RequestOptions 类可以应用变换:

默认变换

Glide.with(fragment) .load(url) .fitCenter() .into(imageView); 或使用 RequestOptions :

RequestOptions options = new RequestOptions(); options.centerCrop();

Glide.with(fragment) .load(url) .apply(options) .into(imageView); 可以查阅 Options 页来获得更多 RequestOption 的相关信息。

多重变换

默认情况下,每个 transform() 调用,或任何特定转换方法(fitCenter(), centerCrop(), bitmapTransform() etc)的调用都会替换掉之前的变换。

如果你想在单次加载中应用多个变换,请使用 MultiTransformation 类,或其快捷方法 .transforms() 。

Glide.with(fragment) .load(url) .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation()) .into(imageView); 或使用快捷方法:

Glide.with(fragment) .load(url) .transform(new FitCenter(), new YourCustomTransformation()) .into(imageView); 请注意,你向 MultiTransformation 的构造器传入变换参数的顺序,决定了这些变换的应用顺序。

定制变换

尽管 Glide 提供了各种各样的内置 Transformation 实现,如果你需要额外的功能,你也可以实现你自己的 Transformation。

BitmapTransformation

如果你只需要变换 Bitmap,最好是从继承 BitmapTransformation 开始。BitmapTransformation 为我们处理了一些基础的东西,例如,如果你的变换返回了一个新修改的 Bitmap ,BitmapTransformation将负责提取和回收原始的 Bitmap。

一个简单的实现看起来可能像这样,在图片基础上新增50%透明度:

public class MaskTransformation extends BitmapTransformation {

private static final int VERSION = 1;

private static final String ID =

"com.utils.MaskTransformation." + VERSION;

private int color;

private int radius;

private Paint paint = new Paint();

private Rect srcRec = new Rect();

private Rect toRec = new Rect();

public MaskTransformation() {

this(Color.parseColor("#80000000"), 12);

}

public MaskTransformation(int color, int radius) {

this.color = color;

this.radius = radius;

paint.setAntiAlias(true);

}

@Override

protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {

return maskBitmap(pool, toTransform, outWidth, outHeight);

}

private Bitmap maskBitmap(BitmapPool pool, Bitmap source, int outWidth, int outHeight) {

if (source == null) return null;

srcRec.right = source.getWidth();

srcRec.bottom = source.getHeight();

toRec.right = outWidth;

toRec.bottom = outHeight;

Bitmap result = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(result);

canvas.drawBitmap(source, srcRec, toRec, paint);

Bitmap bitmap = BitmapUtils.getBitmap(toRec.width(), toRec.height(), DensityUtils.dip2px(AppStoreApplication.getContext(), radius), color);

canvas.drawBitmap(bitmap, srcRec, toRec, paint);

return result;

}

@Override

public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

messageDigest.update((ID + color + radius).getBytes(CHARSET));

}

@Override

public boolean equals(Object o) {

if (!(o instanceof MaskTransformation)) {

return false;

}

MaskTransformation temp = (MaskTransformation) o;

return temp.color == color && temp.radius == radius;

}

@Override

public int hashCode() {

return ID.hashCode() + color + radius * 10;

}

}

尽管你的 Transformation 将几乎确定比这个示例更复杂,但它应该包含了相同的基本元素和复写方法。

必需的方法

请特别注意,对于任何 Transformation 子类,包括 BitmapTransformation,你都有三个方法你 必须 实现它们,以使得磁盘和内存缓存正确地工作:

equals()hashCode()updateDiskCacheKey

如果你的 Transformation 没有参数,通常使用一个包含完整包限定名的 static final String 来作为一个 ID,它可以构成 hashCode() 的基础,并可用于更新 updateDiskCacheKey() 传入的 MessageDigest。如果你的 Transformation 需要参数而且它会影响到 Bitmap 被变换的方式,它们也必须被包含到这三个方法中。

@Override

public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

messageDigest.update((ID + color + radius).getBytes(CHARSET));

}

@Override

public boolean equals(Object o) {

if (!(o instanceof MaskTransformation)) {

return false;

}

MaskTransformation temp = (MaskTransformation) o;

return temp.color == color && temp.radius == radius;

}

@Override

public int hashCode() {

return ID.hashCode() + color + radius * 10;

}

不要忘记 equals() / hashCode()!

值得重申的一点是,为了让内存缓存正常地工作你是否必须实现 equals() 和 hashCode() 方法。很不幸,即使你没有复写这两个方法,BitmapTransformation 和 Transformation 也能通过编译,但这并不意味着它们能正常工作。我们正在探索一些方案,以使在 Glide 的未来版本中,使用默认的 equals() 和 hashCode 方法将抛出一个编译时错误。

打赏

海报 QQ 分享 微博分享 微信分享微信扫一扫 分享 goodnotes图片改变透明度设置图片的透明度从左到右渐变 文章版权声明:除非注明,否则均为壹金热软件原创文章,转载或复制请以超链接形式并注明出处。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3