类DirectColorModel的作用

DirectColorModel类别用于处理像素值中的RGB颜色和alpha信息,适用于ColorSpace.TYPE_RGB类型的ColorSpaces。像素值以单独样本形式存在,并打包成int、short或byte量。支持的颜色样本和alpha样本以位为单位存储在特定的位屏蔽码指示的位置。
DirectColorModel 类别是使用像素值的 ColorModel 类别,像素值以单独样本的形式表示 RGB 颜色和 alpha 信息,并将单个像素的所有样本打包成单个 int、short 或 byte 量。此类别只能与型别 ColorSpace.TYPE_RGB 的 ColorSpaces 一起使用。

此外,对于 ColorSpace 的每个份量,通过 ColorSpace 的 getMinValue() 方法得到的最小标准化份量值必须是 0.0,通过 getMaxValue() 方法得到的最大值必须是 1.0(这些最小/最大值是 RGB 空间的常见值)。像素值中必须有三个颜色样本,且可以有一个 alpha 样本。对于那些使用型别 transferType 的基本数组像素表示形式的方法,数组长度总是 1。受支持的转换型别是 DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT 和 DataBuffer.TYPE_INT。颜色和 alpha 样本以位为单位存储在位屏蔽码指示的数组的单个元素中。每个位屏蔽码必须是连续的,并且屏蔽码一定不能重迭。相同的屏蔽码可以应用于由其它方法使用的单个 int 像素表示形式。DirectColorModel 类别是使用像素值的 ColorModel 类别,像素值以单独样本的形式表示 RGB 颜色和 alpha 信息,并将单个像素的所有样本打包成单个 int、short 或 byte 量。此类别只能与型别 ColorSpace.TYPE_RGB 的 ColorSpaces 一起使用。

此外,对于 ColorSpace 的每个份量,通过 ColorSpace 的 getMinValue() 方法得到的最小标准化份量值必须是 0.0,通过 getMaxValue() 方法得到的最大值必须是 1.0(这些最小/最大值是 RGB 空间的常见值)。像素值中必须有三个颜色样本,且可以有一个 alpha 样本。对于那些使用型别 transferType 的基本数组像素表示形式的方法,数组长度总是 1。受支持的转换型别是 DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT 和 DataBuffer.TYPE_INT。颜色和 alpha 样本以位为单位存储在位屏蔽码指示的数组的单个元素中。每个位屏蔽码必须是连续的,并且屏蔽码一定不能重迭。相同的屏蔽码可以应用于由其它方法使用的单个 int 像素表示形式。

文章地址:[url]http://javapub.iteye.com/blog/736807[/url]
请继续对以下代码进行优化 // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package com.x.kvm.cl.ui.component; import com.x.base.ioc.AnnoBeanAttachToIoc; import com.x.base.ioc.AnnoIocBean; import com.x.base.ioc.Ioc; import com.x.base.util.BUtil; import com.x.kvm.cl.model.ClSession; import com.x.kvm.cl.model.ImageManager; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.awt.image.DirectColorModel; import java.awt.image.Raster; import java.awt.image.WritableRaster; import javax.swing.JPanel; @AnnoIocBean( beanName = "UiClVideoPanel" ) @AnnoBeanAttachToIoc public class UiClVideoPanel extends JPanel { private Ioc ioc = null; private volatile int rpCount = 0; private BufferedImage image = null; private BufferedImage clone_image = null; private final DirectColorModel screenColorModel = new DirectColorModel(24, 16711680, 65280, 255); private final int[] bandmask = new int[]{16711680, 65280, 255}; private WritableRaster raster; private volatile boolean scaleFilterSwitch = true; private Point loc_start = new Point(0, 0); private Point loc_end = new Point(0, 0); public BufferedImage video() { return null != this.clone_image ? this.clone_image : this.image; } public boolean isCapturingTheArea() { return null != this.clone_image; } public void setBufferedImage(int[] databuf, int width, int height) { int valid_width = width; if (0 != width % 32) { int comp_width = 32 - width % 32; width += comp_width; } DataBufferInt databufint = new DataBufferInt(databuf, height * width); this.raster = Raster.createPackedRaster(databufint, width, height, width, this.bandmask, null); this.image = new BufferedImage(this.screenColorModel, this.raster, false, null); if (valid_width != width) { this.image = this.image.getSubimage(0, 0, valid_width, height); } if (this.scaleFilterSwitch && (valid_width - this.getSize().width > valid_width / 8 || height - this.getSize().height > height / 8)) { this.image = BUtil.scale(this.image, this.getSize().getWidth() / (double)valid_width, this.getSize().getHeight() / (double)height, 2); } this.repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); ClSession s = this.ioc.getSingleBean("ClSession"); ImageManager im = this.ioc.getSingleBean("ImageManager"); if (null == this.image) { this.image = im.create("/defaultDesk.jpg"); } g.drawImage(this.video(), 0, 0, this.getWidth(), this.getHeight(), this); if (s.clview.equals("clview1Xml") && this.rpCount < 10) { this.repaint(); ++this.rpCount; } else if (s.clview.equals("clview2Xml") && this.rpCount < 10) { UiClMessagePanel msg = this.ioc.getSingleBean("UiClMessagePanel"); if (msg.isVisible()) { this.repaint(); ++this.rpCount; } } } public void removeJitter() { this.rpCount = 0; this.repaint(); } public void resetCaptureLocs() { this.loc_start.x = 0; this.loc_start.y = 0; this.loc_end.x = 0; this.loc_end.y = 0; } public void setLocsWhenCaptureTheArea(Point start, Point end) { this.loc_start = start; this.loc_end = end; this.repaint(); } public void destroyCloneImage() { this.clone_image = null; } public void cloneCurVideoImageAndUse() { this.clone_image = this.image.getSubimage(0, 0, this.image.getWidth(), this.image.getHeight()); } @Override public void paint(Graphics g) { super.paint(g); if (null != this.clone_image) { Color c0 = g.getColor(); g.setColor(Color.RED); Rectangle rec = this.getCaptureRectangle(); g.draw3DRect(rec.x, rec.y, rec.width, rec.height, true); g.setColor(c0); } } public Rectangle getCaptureRectangle() { Rectangle rec = new Rectangle(); Point start = new Point(); Dimension size = new Dimension(Math.abs(this.loc_start.x - this.loc_end.x), Math.abs(this.loc_start.y - this.loc_end.y)); if (this.loc_start.x < this.loc_end.x) { if (this.loc_start.y < this.loc_end.y) { start = this.loc_start; } else { start.x = this.loc_start.x; start.y = this.loc_end.y; } } else if (this.loc_start.y < this.loc_end.y) { start.x = this.loc_end.x; start.y = this.loc_start.y; } else { start = this.loc_end; } rec.setLocation(start); rec.setSize(size); return rec; } public Rectangle getConvertCaptureRectanle() { if (null == this.clone_image) { return null; } else { Rectangle rec = this.getCaptureRectangle(); int w0 = this.clone_image.getWidth(); int h0 = this.clone_image.getHeight(); int w1 = this.getPreferredSize().width; int h1 = this.getPreferredSize().height; double rw = (double)w0 / (double)w1; double rh = (double)h0 / (double)h1; rec.x = (int)(rw * (double)rec.x); rec.y = (int)(rh * (double)rec.y); rec.width = (int)(rw * (double)rec.width); rec.height = (int)(rh * (double)rec.height); return rec; } } public BufferedImage getCloneImage() { return this.clone_image; } }
最新发布
11-06
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值