- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本上我的问题分为两部分。
我想知道操纵像素并将某种颜色变成透明像素的首选/快速方法。
我想知道我是否能够使用这个“BufferedImage”,而不必将其保存为支持透明度的文件格式,例如“png”。
我找到了一种设置单个像素的方法
这里
BufferedImage layer = ImageIO.read(new File(file));
System.out.println(layer.getWidth());
BufferedImage image = new BufferedImage(layer.getWidth(), layer.getHeight(), BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = image.getRaster();
int width = layer.getWidth();
int height = layer.getHeight();
// Slow method: scan all input (layer) image pixels, plotting only those which are not the transparency color
int lPixel,red,green,blue;
for(int w=0;w<width;w++)
for(int h=0;h<height;h++)
{
lPixel = layer.getRGB(w,h);
if ((lPixel&0x00FFFFFF) != trans) //transparent color
{
red = (int)((lPixel&0x00FF0000)>>>16); // Red level
green = (int)((lPixel&0x0000FF00)>>>8); // Green level
blue = (int) (lPixel&0x000000FF); // Blue level
// Set the pixel on the output image's raster.
raster.setPixel(w,h,new int[]{red,green,blue,255});
}
}
正如它所提到的,这是一种“缓慢的方法”。
<小时/>我找到了这个帖子 Java: Filling a BufferedImage with transparent pixels
哪一条评论讨论了“int[]”以及在那里操纵像素。
<小时/>我注意到我可以在 bufferedImage 中使用“setRGB”设置每个像素,但“WritableRaster...”中会有“setpixel”
为什么要在“BufferedImage”中使用“WritableRaster”的“setpixel”而不是“setRGB”?
我也很好奇如何访问“int[]”以及这是否是解决此问题的首选方法?
有没有一种方法可以搜索某些彩色像素,而不是自己遍历每个像素来找到正确的颜色?
只是好奇首选/最快的方法是什么。
使用 int[] 的方法声称它不会使用“硬件加速”,所以我很好奇这是否也很重要?
<小时/>我假设一旦它被缓冲,我就可以对其做任何事情,但我很好奇其他人怎么想?
<小时/>想法?
非常感谢您的帮助!
最佳答案
关于第二个问题:您只需将文件加载到支持透明度的正确格式的 BufferedImage 中,例如:BufferedImage.TYPE_INT_ARGB
。 ARGB
表示“阿尔法、红、绿、蓝”其中 alpha 代表透明度。您可以随心所欲地操作 BufferedImage,文件格式就是您最终打算如何编写它。
关于你的第一个问题,我不确定你将如何优化它,因为你将必须访问每个像素(无论你使用哪种方法),并更改值。我会选择慢速方法,因为(对我来说)似乎是不可避免的。
编辑: int[] 方法基本上是获取 WritableRaster 中的值并将它们放入数组中。因此,您不必调用 setRGB()
,而只需调用 array[i][j]=someValue
。理论上,这会提高性能,因为您将执行低级别的操作(访问某些数组中的值),而不是像 setRGB()
这样的更高级别的方法调用。但是您仍然需要将该数组转换回来转换为 Raster,然后返回 BufferedImage。说实话,这样做的利润似乎可以忽略不计,因为你不是在制作高性能游戏。我只是在 4K 图像(你通常会遇到的最高分辨率)上尝试了“慢速”方法,程序在 10 秒内完成(知道我在最坏的情况下将所有像素设置为透明)。通常的高清图片将花费大约 4 倍的时间。
关于java - BufferedImage 和具有透明度的像素操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877874/
我正在努力做到这一点 在我的操作中从数据库获取对象列表(确定) 在 JSP 上打印(确定) 此列表作为 JSP 中的可编辑表出现。我想修改然后将其提交回同一操作以将其保存在我的数据库中(失败。当我使用
我有以下形式的 Linq to Entities 查询: var x = from a in SomeData where ... some conditions ... select
我有以下查询。 var query = Repository.Query() .Where(p => !p.IsDeleted && p.Article.ArticleSections.Cou
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
以下代码产生错误 The nested query is not supported. Operation1='Case' Operation2='Collect' 问题是我做错了什么?我该如何解决?
我已经为 HA redis 集群(2 个副本、1 个主节点、3 个哨兵)设置了本地 docker 环境。只有哨兵暴露端口(10021、10022、10023)。 我使用的是 stackexchange
我正在 Desk.com 中构建一个“集成 URL”,它使用 Shopify Liquid 模板过滤器语法。对于开始日期为 7 天前而结束日期为现在的查询,此 URL 需要包含“开始日期”和“结束日期
你一定想过。然而情况却不理想,python中只能使用类似于 i++/i--等操作。 python中的自增操作 下面代码几乎是所有程序员在python中进行自增(减)操作的常用
我需要在每个使用 github 操作的手动构建中显示分支。例如:https://gyazo.com/2131bf83b0df1e2157480e5be842d4fb 我应该显示分支而不是一个。 最佳答
我有一个关于 Perl qr 运算符的问题: #!/usr/bin/perl -w &mysplit("a:b:c", /:/); sub mysplit { my($str, $patt
我已经使用 ArgoUML 创建了一个 ERD(实体关系图),我希望在一个类中创建两个操作,它们都具有 void 返回类型。但是,我只能创建一个返回 void 类型的操作。 例如: 我能够将 book
Github 操作仍处于测试阶段并且很新,但我希望有人可以提供帮助。我认为可以在主分支和拉取请求上运行 github 操作,如下所示: on: pull_request push: b
我正在尝试创建一个 Twilio 工作流来调用电话并记录用户所说的内容。为此,我正在使用 Record,但我不确定要在 action 参数中放置什么。 尽管我知道 Twilio 会发送有关调用该 UR
我不确定这是否可行,但值得一试。我正在使用模板缓冲区来减少使用此算法的延迟渲染器中光体积的过度绘制(当相机位于体积之外时): 使用廉价的着色器,将深度测试设置为 LEQUAL 绘制背面,将它们标记在模
有没有聪明的方法来复制 和 重命名 文件通过 GitHub 操作? 我想将一些自述文件复制到 /docs文件夹(:= 同一个 repo,不是远程的!),它们将根据它们的 frontmatter 重命名
我有一个 .csv 文件,其中第一列包含用户名。它们采用 FirstName LastName 的形式。我想获取 FirstName 并将 LastName 的第一个字符添加到它上面,然后删除空格。然
Sitecore 根据 Sitecore 树中定义的项目名称生成 URL, http://samplewebsite/Pages/Sample Page 但我们的客户有兴趣降低所有 URL(页面/示例
我正在尝试进行一些计算,但是一旦我输入金额,它就会完成。我只是希望通过单击按钮而不是自动发生这种情况。 到目前为止我做了什么: Angular JS - programming-fr
我的公司创建了一种在环境之间移动文件的复杂方法,现在我们希望将某些构建的 JS 文件(已转换和缩小)从一个 github 存储库移动到另一个。使用 github 操作可以实现这一点吗? 最佳答案 最简
在我的代码中,我创建了一个 JSONArray 对象。并向 JSONArray 对象添加了两个 JSONObject。我使用的是 json-simple-1.1.jar。我的代码是 package j
我是一名优秀的程序员,十分优秀!