我有一张图片(mx),我想获得点击的像素单位。
有什么想法吗?
答案 0 :(得分:10)
BitmapData LiveDoc Page上的几分钟会带您到达您需要去的地方。将图像加载到Bitmap变量后,可以访问其BitmapData属性。向图像添加Mouse Click Event侦听器,然后使用BitmapData::getPixel。 getPixel的示例显示了如何将uint响应转换为rgb十六进制代码。
以下是对我有用的BitmapData页面上给出的示例的修改(使用mxmlc - YMMV):
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
public class BitmapDataExample extends Sprite {
private var url:String = "santa-drunk1.jpg";
private var size:uint = 200;
private var image:Bitmap;
public function BitmapDataExample() {
configureAssets();
}
private function configureAssets():void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(url);
loader.load(request);
addChild(loader);
}
private function completeHandler(event:Event):void {
var loader:Loader = Loader(event.target.loader);
this.image = Bitmap(loader.content);
this.addEventListener(MouseEvent.CLICK, this.clickListener);
}
private function clickListener(event:MouseEvent):void {
var pixelValue:uint = this.image.bitmapData.getPixel(event.localX, event.localY)
trace(pixelValue.toString(16));
}
}
}
答案 1 :(得分:8)
这是一个更简单的实现。您所做的就是使用bitmapData的 draw()方法拍摄舞台的快照,然后在鼠标下的像素上使用 getPixel()。这样做的好处是,您可以对绘制到舞台上的任何内容进行采样,而不仅仅是给定位图。
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
stage.addEventListener(MouseEvent.CLICK, getColorSample);
function getColorSample(e:MouseEvent):void {
var bd:BitmapData = new BitmapData(stage.width, stage.height);
bd.draw(stage);
var b:Bitmap = new Bitmap(bd);
trace(b.bitmapData.getPixel(stage.mouseX,stage.mouseX));
}
希望这有用!
修改强>:
此修改后的版本使用单个BitmapData
,并删除了创建Bitmap
的不必要步骤。如果您在MOUSE_MOVE
上对颜色进行采样,那么这对于避免内存问题至关重要。
注意:如果您使用自定义光标精灵,则必须使用“状态”以外的对象,否则您将采样自定义精灵的颜色而不是其下的颜色。
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
private var _stageBitmap:BitmapData;
stage.addEventListener(MouseEvent.CLICK, getColorSample);
function getColorSample(e:MouseEvent):void
{
if (_stageBitmap == null) {
_stageBitmap = new BitmapData(stage.width, stage.height);
}
_stageBitmap.draw(stage);
var rgb:uint = _stageBitmap.getPixel(stage.mouseX,stage.mouseY);
var red:int = (rgb >> 16 & 0xff);
var green:int = (rgb >> 8 & 0xff);
var blue:int = (rgb & 0xff);
trace(red + "," + green + "," + blue);
}
答案 2 :(得分:8)
这不是特定于Flex或mx:Image,并允许您从任何位图可绘制对象中获取像素颜色值(前提是您有权限):
private const bitmapData:BitmapData = new BitmapData(1, 1);
private const matrix:Matrix = new Matrix();
private const clipRect:Rectangle = new Rectangle(0, 0, 1, 1);
public function getColor(drawable:IBitmapDrawable, x:Number, y:Number):uint
{
matrix.setTo(1, 0, 0, 1, -x, -y)
bitmapData.draw(drawable, matrix, null, null, clipRect);
return bitmapData.getPixel(0, 0);
}
您可以轻松地从舞台或mx:Image实例中抓取一个像素。它比绘制整个舞台(或可绘制对象)更有效,并且应该足够快以连接到MouseEvent.MOUSE_MOVE以获得即时视觉反馈。