SWT图像处理

stm32 + freertos + c++混合编程方法 其他一些资料上面,c++配置成--cpp11或者-cpp 都是把工程配置成c++。三、添加cpp文件,我们调用cpp文件里面的接口函数,不需要修改main.c后缀名。2、配置工程编译时候是--c99,是因为工程里面FreeRTOS是c语言,c++模式会报错。我们这里是默认c,编写的c++文件,单独选择--cpp编译,这在后面配置!c++是面向对象编程,对于一些项目来说,c++编程更加合适!stm32cubemax配置,这里就不写了,配置资料比较多。这里就是让cpp文件在c++下编译。最后,编程成功,点亮! 阅读详情

Standard Widget Toolkit ( SWT,标准窗口小部件工具箱),是在 Eclipse 平台上使用的窗口小部件工具箱,它能向开发者提供和本机平台一致的用户界面和比较稳定的性能,也提供了强大的图像处理功能。本文首先介绍 SWT 封装的 Image, ImageData 等类,接着根据作者实际工作经验给出了一些常见图像处理的解决方法。

 


 

SWT Images简介

软件开发人员可以利用 SWT 封装的 Image, ImageData 等类来创建图像、存储图像数据,也可以对存储的图像数据进行各种图像变换。本文将演示如何正确的使用 Image, ImageData 等类,以及如何使图像变灰、变亮/黑、图像旋转、图像拉伸、图片透明叠加、图片反色等相关问题。

下面就来介绍一下 Image 和 ImageData 这两个在 SWT Images 中最重要的类。

类 org.eclipse.swt.graphics.Image 被用来表示可以在设备上显示的图片,可以用方法如GC.drawImage() 或者 Button.setImage() 等来将它显示出来。Image 类提供了几个构造函数,可以完成以下功能:

  • 装载一个现有的图象。可以通过传入文件名或者 InputStream 作为参数,但是图象的格式必须是它所支持的格式之(目前 SWT Image 支持 BMP、GIF、JPG、PNG、Windows ICO 等格式)一,否则会抛出 SWTException 异常。
  • 构造一个用已经存在的 ImageData 进行初始化的图像。
  • 构造一个空图像。可以通过修改其像素值或者向它拷贝一个 SWT 图形上下文的内容 (GC) 来绘制该图像,并且可以指定空图像的大小。

类 org.eclipse.swt.graphics.ImageData 中存储了图像的像素数据信息。 ImageData 是一个包含有关图像大小、调色板、颜色值和透明度等信息的类。我们可以对这些图像像素数据可以直接读或者写操作,这意味着可以通过直接读取或者修改图像的 数据,来设置或者取得图像中任何像素或者任何一组像素的颜色值。关于 ImageData ,我们还应当了解以下一些字段:

  • width 和 height 指定图像的宽和高。Depth 指定图像的颜色深度。可能的值为 1、2、4、8、16、24 或者 32,指定编码每一个像素的值所使用的比特数。
  • alpha 与 alphaData 定义图像的透明度。alpha 定义了图象的全局透明度值,默认值为 -1,否则 alphaData 域将被忽略。当 alpha 不等于 -1 时, alphaData 存储了图象的透明度缓冲区,每个像素可以有一个在 0~255 之间的透明度值,数值越大,表示越不透明。值得注意的是,只有部分图象格式具有透明度,例如 GIF 和 PNG。
  • palette 包含一个 PaletteData 对象,它存储有关图像的颜色模型的信息。SWT 的颜色模型可以是索引或者直接的,由其域 isDirect 来指定。如果颜色模型是索引的,那么 PaletteData 包含颜色索引,可以通过方法 getRGBs() 来获取 RGB 信息。如果它是直接的,那么它包含转换信息,表明应当如何从像素的整数值中提取出颜色 RGB 成分。
  • data 包含像素值的字节缓冲区。字节编码的方法取决于所使用的颜色深度。对于一个 8 位的图像,数组中的一个字节正好表示图像中一个像素的值。对于 16 位图像,每一个像素值编码为缓冲区中的两个字节。这两个字节以最低有效字节顺序存储。对于 24 或者 32 位图像,每一个像素值以最高有效位字节顺序编码为缓冲区中的三个或者四个字节。
  • bytesPerLine 表明缓冲区中有多少字节用于表示图像中一行像素的所有像素值。由于一个像素可能有多个字节表示,所以 bytesPerLine 可能是字段 width 值的若干倍。

 



  

 

SWT图象处理

常见的图象处理包含图象的读/写、图像变灰、变亮/黑、图像旋转、图像拉伸、图片透明叠加、图片反色等。下面将就这些问题逐个介绍,表 1 列出了各个清单所对应的图像处理。


表 1. 示例代码清单

代码清单图像处理类型
清单 1图象的读写
清单 2图像变灰
清单 3图像变亮/变黑
清单 4图像旋转
清单 5图像反色
清单 6图像拉伸
清单 7图片透明叠加

 

图像的读写

我们可以使用类 org.eclipse.swt.graphics.ImageLoader 来加载或者保存图像。 ImageLoader 具有一个全局的成员变量 ImageData[],它用于存储图片数据。


清单 1. 图像读写示例

String fileName = "source.jpg";
String saveName = "saved.jpg";
ImageLoader loader = new ImageLoader();
ImageData[] imageData = loader.load(fileName);
if(imageData.length > 0){
Image newImage = new Image(null, imageData[0]);
//对newImage进行操作
...
loader.data[0] = newImage.getImageData();
loader.save(saveName, SWT.IMAGE_BMP);
}

 

图像变灰

图像变灰在桌面应用程序中有着广泛的应用。例如,一个图标被作为一个按钮的背景,我们需要一个灰色效果的图标作为按钮的背景来表示这个按钮处于禁用 状态。在SWT中,基于已经存在的图像来创建一个具有灰色效果的图像,我们可以使用构造函数 Image(Display display, Image image, int flag) 来创建,其中参数 flag 使用 SWT.IMAGE_GRAY。


清单2. 图像变灰示例

Image newImage = new Image(null, image, SWT.IMAGE_GRAY);

 

图像变亮/变黑

下面讨论图像变亮/变黑。 RGB 和 HSL (也叫 HSB/HSV )是两种色彩空间,即:红、绿、蓝( Red, Green, Blue) 和色调、饱和度、亮度( Hue, Saturation, Lightness 或 Brightness 或 Value),前者适用于机器采样,目前的显示器颜色即由这三种基色构成,而后者更符合人类的直观感觉。在 Windows 的标准颜色对话框中均包含这两种表示方法。 RGB 的取值范围在 0~255 之间, HSL 的取值在 0~1 之间。因此我们只需要将 HSL 空间数据的 L 分量进行调整即可调整此图像的亮度。要实现图像变亮/变黑的功能,只需要调整清单 3 中函数 lightImage 行(*)中等号右边的值( 0 到 1 之间)。


清单 3. 图像变亮示例

private static ImageData lightImage(ImageData srcData) {
double[] data = rgbTohsl(srcData.data);
byte[] newData = new byte[srcData.data.length];
int bytesPerPixel = srcData.bytesPerLine / srcData.width;
int destBytesPerLine = srcData.width * bytesPerPixel;
for(int i = 0; i < data.length; i += 3) {
data[i + 2] = 0.75; ----------------- (*)
}
data = hslTorgb(data);
for(int i = 0; i < srcData.data.length; i ++) {
newData[i] = (byte)data[i];
}
ImageData newImageData = new ImageData(srcData.width, srcData.height,
srcData.depth,srcData.palette, destBytesPerLine, newData);
return newImageData;
}

 

其中,方法 double[] rgbTohsl(byte[] data) 是把 RGB 空间数据转换到 HSL 空间;相反的,方法 double[] hslTorgb(double[] data) 是把数据从 HSL 空间转换到 RGB 空间。

图像旋转

清单4中方法 rotate 实现了将图像相左旋转 90 度。如图 1 ,对于像素点 (x, y) ,向左旋转90 度以后,它在图象中的位置变成了 (y, width - x - 1) 。因此,相左旋转 90 度即将所有的像素点按照规则换一下位置。其他的旋转可用同样的方法。


图1 旋转前与相左旋转 90 度后
旋转前与相左旋转 90 度后

清单4. 图像旋转示例

private static ImageData rotate(ImageData srcData) {
int bytesPerPixel = srcData.bytesPerLine / srcData.width;
int destBytesPerLine = srcData.height * bytesPerPixel;
byte[] newData = new byte[srcData.data.length];
int width = 0, height = 0;
for (int srcY = 0; srcY < srcData.height; srcY++) {
for (int srcX = 0; srcX < srcData.width; srcX++) {
int destX = 0, destY = 0, destIndex = 0, srcIndex = 0;
destX = srcY;
destY = srcData.width - srcX - 1;
width = srcData.height;
height = srcData.width;
destIndex = (destY * destBytesPerLine) + (destX * bytesPerPixel);
srcIndex = (srcY * srcData.bytesPerLine) + (srcX * bytesPerPixel);
System.arraycopy(srcData.data, srcIndex, newData, destIndex, bytesPerPixel);
}
}

return new ImageData(width, height, srcData.depth, srcData.palette,
destBytesPerLine, newData);
}

 

图像反色

对于彩色图像的 R、G、B 各彩色分量取反的技术就是图像的反色处理,这在处理二值化图像的连通区域选取的时候非常重要。如物体连通域用黑色表示,而二值化后的物体连通域图像可那是 白色的,而背景是黑色的,这时应手动选取图像的反色处理或有程序根据背景和物体连通域两种颜色的数量所占比例而自动选择是否选择选取图像的反色处理,其算 法很简单,假设源图像一像素的红,绿,蓝分量为 (R,G,B),则目标图像该像素的红绿蓝分量应变为 (255 - R,255 - G, 255 - B)。


清单5. 图像反色示例

private static ImageData reverseImage(ImageData srcData)
{
int bytesPerPixel = srcData.bytesPerLine / srcData.width;
int destBytesPerLine = srcData.width * bytesPerPixel;
byte[] newData = srcData.data;

for (int i = 0; i < newData.length; i ++)
newData[i] = (byte) (255 - newData[i]);
ImageData newImageData = new ImageData(srcData.width, srcData.height,
srcData.depth, srcData.palette, destBytesPerLine, newData);
newImageData.transparentPixel = srcData.transparentPixel;

return newImageData;
}

 

图像拉伸

图像的缩小/放大一般分为按比例缩小和不按比例缩小两种。图像的缩小操作中,是在现有的信息里如何挑选所需要的有用信息。图像的放大操作中,则需对 尺寸放大后所多出来的空格填入适当的值,这是信息的估计问题,所以较图像的缩小要难一些,而且图像大比例放大时经常会出现马赛克效应。庆幸的是,SWT 工具箱对图像的拉伸进行了封装,开发者只需要调用方法 ImageData.scaledTo(int width, int height) 来获得一个拉伸后的 ImageData。


清单6. 图像拉伸示例

Image newImage = new Image(null, imageData[0].scaledTo(imageData[0].width / 2,
imageData[0].height / 2));

 

图片透明叠加

透明叠加方式是图象处理中常用的一种处理方式,在这种处理方式中,一幅图片叠加到另一幅图片上,但是这幅图象不是完全将原来的图象覆盖,而是能够部 分的透过叠加的图象显示出来,透明的程度由透明度参数指定(假定为 a,其值在 0 与 1 之间,数值越小表明被叠加的图片越透明),其原理是目标图片的 R、G、B 以及 alpha 分别为待叠加图片 1 的 R、G、B 以及 alpha 分量乘以透明度参数 a 加上待叠加图片 2 的 R、G、B 以及 alpha 分量乘以 1-a 的值。我们可以使用图片的透明叠加作出水印的效果。


清单7. 图像透明叠加示例

private static ImageData watermark(ImageData srcData1, ImageData srcData2, double alpha) {
if(srcData1.width != srcData2.width || srcData1.height !=
srcData2.height || rcData1.bytesPerLine != srcData2.bytesPerLine)
//未考虑不同大小图片的叠加
return null;
int bytesPerPixe = srcData1.bytesPerLine / srcData1.width;
int destBytesPerLine = srcData1.width * bytesPerPixe;
byte[] newData = new byte[srcData1.data.length];

ImageData newImageData = new ImageData(srcData1.width, srcData1.height, srcData1.depth,
srcData1.palette, destBytesPerLine, newData);
for (int srcY = 0; srcY < srcData1.height; srcY++) {
for (int srcX = 0; srcX < srcData1.bytesPerLine; srcX++) {
int idx = srcY * srcData1.bytesPerLine + srcX;
newImageData.data[idx] = (byte)(alpha * srcData1.data[idx] +
(1- alpha) * srcData2.data[idx]);
}
}
return newImageData;
}
从特斯拉到蔚来:拆解主流智能汽车的车联网架构,看它们如何实现‘车、路、云’协同 本文深度解析了特斯拉、蔚来等主流智能汽车的车联网架构,详细拆解了其‘车、路、云’协同的技术实现。从车内网络、车际通信到云端协同,分析了通信技术、系统架构等关键技术选择,揭示了不同厂商如何通过差异化布局构建竞争优势。 阅读详情

相关推荐

手把手教你用Xilinx Ultrascale+ FPGA解串12-bit ADC的LVDS信号(附Verilog代码)

本文详细介绍了如何使用Xilinx Ultrascale+ FPGA解串12-bit ADC的LVDS信号,涵盖硬件设计、时钟域处理和数据对齐等关键技术。通过Verilog代码实例和调试技巧,帮助工程师解决高速数据采集中的核心挑战,提升系统稳定性和性能。

weixin_42522964的博客 351

java中图像简单处理

Java简单图像处理 Java图像格式转换 ImageIO 目前支持一下格式: BMP, JPG,PNG, JPEG, WBMP, GIF import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.image...

Myblog 419

第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 对接后端登录接口(上)

这里是Vben Admin V5版本实战体验,上一节我们前端已正常运行,但是没有实现登录。本节的重点是对接后端接口。上一节地址:第一节:Vben Admin 最新 v5.0初体验第二节:Vben Admin 登录逻辑梳理和对接后端准备后端我们采用Python的Flask项目,Flask-SQLAlchemy管理数据库模型,Flask-Migrate进行模型迁移。参考版本如下:Flask3.0.23.1.1到这里,登录接口完成,下一步要实现获取用户信息和权限的接口功能。

cuiwin的专栏 1809

使用Eclipse RCP进行桌面程序开发(五):2D绘图

看完这篇文章,可以实现如下界面: 当我第一次看到RCP的时候,我就梦想着有一天能够用它开发界面华丽的2D和3D程序,经历过前面的探索,今天终于可以揭开2D绘图的神秘面纱。在包资源管理器的插件依赖项中,我们一眼就可以看到org.eclipse.swt.graphics包,毫无疑问,和2D绘图有关的类就在这个包中。还有一个org.eclipse.swt.opengl包也很引人注目,但是里面却只有GLCanvas类和GLData类,怎么也找不到传说中的GL类和GLU类,也许下一篇文章我会写出关于3D的内容,但也许

limingmcu的专栏 437

SWT中显示图片并调整大小

如何在SWT中显示图片并调整大小呢?在swt中要显示的图片是不能改变大小的,比如我们用backgroundimage。但是有时我需要把我们想要显示的图片按一定比例自动的适应我们要显示的区域,这是我们要用画图的方法来实现。 每一个控件都有一个paintContral的事件,我们可以

abrahu的专栏 1万+

使用SWT实现图片预览

使用SWT实现图片预览 工作中需要使用swt进行需求开发:给出一组图片,能够预览等其他操作。 将图片预览相关代码列出,写了一个测试项目,作为记录及参考。 首先列出效果图 封装了一个用于展示图片的类,根据构造方法可以设置显示的行数及列数。根据设置的宽高进行自适应,可以实现滚动条,选择,查看,全选,反选,图片大小自适应等其他操作。 封装类代码 package name.hanenhao....

qq_34493459的博客 1064

Eclipse中的图片资源管理

注:本文为网上摘录(http://tech.ddvip.com/2008-12/122889686098903.html)原作者:朱兴     在本文中,将讨论如下内容:   1、 系统资源,为后面讨论图片资源做一铺垫   2、 SWT中的图片资源管理   3、 Display hook销毁机制,JFace中图片资源管理的重要基础   4、 JFace中的ImageDescriptor

我的地盘听我的 1334

SWT图像处理入门

Standard Widget Toolkit ( SWT ,标准窗口小部件工具箱),是在 Eclipse平台上使用的窗口小部件工具箱,它能向开发者提供和本机平台一致的用户界面和比较稳定的性能,也提供了强大的图像处理功能。本文首先介绍 SWT封装的 Image , ImageData 等类,接着根据作者实际工作经验给出了一些常见图像处理的解决方法。 SWT 图像处理入门

【Java究竟怎么玩?】 3279

SWT 图像处理入门

Standard Widget Toolkit ( SWT ,标准窗口小部件工具箱),是在 Eclipse 平台上使用的窗口小部件工具箱,它能向开发者提供和本机平台一致的用户界面和比较稳定的性能,也提供了强大的图像处理功能。本文首先介绍 SWT 封装的 Image , ImageData 等类,接着根据作者实际工作经验给出了一些常见图像处理的解决方法。SWT 图像处理入门Stand

IBM技术期刊 2014

Java SWT图像处理入门

Standard Widget Toolkit ( SWT ,标准窗口小部件工具箱),是在 Eclipse 平台上使用的窗口小部件工具箱,它能向开发者提供和本机平台一致的用户界面和比较稳定的性能,也提供了强大的图像处理功能。本文首先介绍 SWT 封装的 Image , ImageData 等类,接着根据作者实际工作经验给出了一些常见图像处理的解决方法。   SWT 图像处理入门

兰染 1820

AI PR Review自建指南:从百万报价到核心模块落地实践

代码审查是保障软件质量的重要环节。随着AI编程普及,PR(Pull Request)审查逐渐成为研发协作中的新瓶颈。基于大语言模型的自动化代码审查,能够通过获取Diff、补充上下文、构造结构化提示词,让模型按规则输出可落地的评审意见。这种自建AI PR Review方案,相比采购企业级平台,可显著降低成本和定制门槛,尤其适合多仓库、规则频繁调整的中小团队。实际落地时,需关注Webhook事件触发、diff上下文补全、评论去重、模型输出解析等关键模块。Nitpicler项目展示了一条以最小成本拆解百万美元报价

weixin_30652491的博客 337

SWT/Jface 图片自动缩放的例子

原创的例子 图片是做到label上了  其实控件的原理是通的 大家想放哪就放哪 哈哈 import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Image;

Hello Eclipse Plugin 黑夜 3439

swt浏览文件 显示文件目录 swt显示图片以及图片缩放处理

swt 显示文件 显示文件目录 swt显示图片 swt 图片缩放

暮鼓的博客 1007

java:SWT 缩放图像(Image)

SWT中下面两个方法都可以实现Image缩放, GC.drawImage(Image image, int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight); ImageData.scaledTo(int width, int height) 但是为了

10km的专栏 4817

java swt 不显示图片,Java SWT图像大小调整不起作用

爪哇SWT图像的大小调整为适当的工作ImageLoader的类被用于从加载的图像,和图像保存到,一个文件或流imageLoader.save(result, SWT.IMAGE_COPY)的FileDialog类允许用户导航文件系统并选择或输入文件名。Button btnOpen = new Button(parent, SWT.NONE);btnOpen.setBounds(200, 55, 6...

weixin_32412379的博客 241

java swt canvas_SWT 图形绘画接口详解 (SWT Graphics)

以下代码是把一个图像作为构造参数获取图像的GC,然后在它上面绘制线条。从左上角顶点(0,0)处向右下角顶点画线条 从右上角顶点向左下角顶点画线条。Image image = new Image(display,"C:/devEclipse_02/eclipse/plugins/org.eclipse.platform_2.0.2/eclipse_lg.gif");GC gc = new GC(...

weixin_39618956的博客 903

Java SWT Image 图像 —— 放大 缩小 Scaling

There are times when this will not always be the case and you need to stretch or shrink the image, and there are two ways to do achieve this. The first is to use the GC to stretch and clip it, using G...

xmind 438

泥石流目标检测数据集_6653张遥感图像_23000个标注框_包含debris-flow_11111个_muddy_634个_rock_11487个_三种类别_采用YOLO和VOC.zip

泥石流目标检测数据集_6653张遥感图像_23000个标注框_包含debris-flow_11111个_muddy_634个_rock_11487个_三种类别_采用YOLO和VOC.zip

可以导入vmware workstation的华为防火墙usg6000.rar

本人亲测,而且功能和现在最新真实防火墙完全一样,不像ENSP里面的防火墙有各种各样的BUG,导出的配置可以直接导入真实防火墙内,打开后密码是华为防火墙默认密码

下一篇: 插件记忆
GreenVesture
博客等级 码龄17年 33粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值