goodnotes图片改变透明度,设置图片的透明度从左到右渐变 |
您所在的位置:网站首页 › goodnotes怎么导入多个图片 › goodnotes图片改变透明度,设置图片的透明度从左到右渐变 |
温馨提示:这篇文章已超过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 分享 微博分享 微信分享 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |