`

[转] BMPText与BMPSlicer——将位图切割成块来显示文字

阅读更多
因为矢量图的表现力毕竟有限,因此我们经常需要使用外部的图片来显示文字等信息,最多的情况就是显示数字和字母。

但是,如果将每个数字或者字母做成一个图片,在程序运行过程中,就要载入许多的小文件,这样出错的几率就会变大,而且也会影响网络性能。因此,我写了两个类来处理这种情况。

例如:要使用0-9的数字图片,可以将0-9拼在一张长条形的图片中,载入后使用BMPSlicer来切割,切割后,就可以使用BMPText来显示它。

下图就是被切割的图片:






package
{
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;

import org.zengrong.display.BMPText;


[SWF(width=200,height=100,backgroundColor=0xCCCCCC)]
public class BMPTextTest extends Sprite
{
        public function BMPTextTest()
        {
                _bmpText = new BMPText('0123456789', 46, 52, true, Bitmap(new _timerClass()).bitmapData);
                _bmpText.gap = -10;
                addChild(_bmpText);
                _timer = new Timer(100, 99999);
                _timer.addEventListener(TimerEvent.TIMER, handler_timer);
                _timer.start();
                this.addEventListener(Event.ADDED_TO_STAGE, handler_addToStage);
        }
        
        [Embed(source="timer.png")]
        private static var _timerClass:Class;
        
        private var _bmpText:BMPText;
        private var _timer:Timer;

        private function handler_addToStage(evt:Event=null):void
        {
                _bmpText.x = stage.stageWidth/2 - _bmpText.width/2;
                _bmpText.y = stage.stageHeight/2 - _bmpText.height/2;
        }
        
        private function handler_timer(evt:TimerEvent):void
        {
                _bmpText.text = _timer.currentCount.toString();
                handler_addToStage();
        }
}
}

////////////////////////////////////////////////////////////////////////////////
//
//  zengrong.net
//  创建者:        zrong
//  最后更新时间:2010-12-07
//
////////////////////////////////////////////////////////////////////////////////
package org.zengrong.display
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Sprite;


/**
 * 用位图拼成文字形式用于显示 
 * @author zrong
 */
public class BMPText extends Sprite
{
        /**
         * 设置所有能显示的字符范围,以及提供代替字符显示用的BitmapData数据。 
         * @param $allText 所有能显示的字符串
         * @param $width 字符图片的宽度
         * @param $height 字符图片的高度
         * @param $transparent 字符图片是否支持透明
         * @param $bmds 字符图片数据,可以为一个或多个。<br />
         * 每个参数都必须是BitmapData类型。<br />
         * 如果提供的字符图片数据小于$allText的字符数量,则仅使用第一个BitmapData进行切割。<br />
         * 否则按照提供的参数的数据与$allText字符串中的字符进行对应。
         */     
        public function BMPText($allText:String='', $width:int=-1, $height:int=-1, $transparent:Boolean=false, $direction:String='horizontal', ...$bmds:Array)
        {
                if($allText && $width>0 && $height>0 && $bmds.length>0)
                {
                        var __args:Array = [$allText, $width, $height, $transparent, $direction];
                        setBMPAndText.apply(this, __args.concat($bmds));
                }
        }
        
        private var _text:String;               //当前正在显示的字符
        private var _allText:String;    //支持显示的所有字符
        private var _gap:int = 0;               //文字间距
        private var _allTextLength:int; //支持显示的所有字符的数量
        private var _bmpWidth:int;              //一个文字位图的宽度
        private var _bmpHeight:int;             //一个文字位图的高度
        private var _transparent:Boolean;       //是否透明
        private var _direction:String;          //切割方向
        private var _slice:BMPSlicer;   //用来对长的位图进行切片
        private var _bmdList:Vector.<BitmapData>;       //支持显示的所有字符对应的BitmapData列表
        private var _textIndex:Object;                  //保存每个文字的索引
        
        //--------------------------------------------------------------------------
        //
        //  公有方法
        //
        //--------------------------------------------------------------------------
        
        //----------------------------------
        //  getter方法
        //----------------------------------
        /**
         * 获取当前正在显示的字符串。 
         */     
        public function get text():String
        {
                return _text;
        }
        
        /**
         * 获取允许显示的所有字符串。 
         */     
        public function get allText():String
        {
                return _allText;
        }
        
        public function get gap():int
        {
                return _gap;
        }
        
        //----------------------------------
        //  setter方法
        //----------------------------------
        /**
         * 设置文本位图之间的间隔。 
         * @param $gap 文本位图之间的间隔。
         */     
        public function set gap($gap:int):void
        {
                _gap = $gap;
                var __child:int = numChildren;
                for(var i:int=0; i<__child; i++)
                {
                        var __dis:DisplayObject = getChildAt(i);
                        __dis.x = i * _bmpWidth;
                        if(i > 0)
                                __dis.x += i*_gap;
                }
        }
        
        /**
         * 设置显示的文本。
         * @param $text 要显示的文本。
         * @throw RangeError 如果参数中的文本中有字符不在允许字符的范围内,就会抛出此异常。
         */     
        public function set text($text:String):void
        {
                while(numChildren>0)
                        removeChildAt(0);
                if(!_allText || !_bmdList)
                        return;
                _text = $text;
                var __length:int = _text.length;
                for(var i:int=0; i<__length; i++)
                {
                        var __curTxt:String = _text.charAt(i);
                        if(_allText.indexOf(__curTxt) == -1)
                                throw new RangeError('字符"'+__curTxt+'"不在允许的字符范围内。');
                        var __bmp:Bitmap = getTextBMP(__curTxt);
                        __bmp.x = i * _bmpWidth;
                        //如果不是第一个图片,就加上分隔宽度
                        if(i > 0)
                                __bmp.x += i*_gap;
                        addChild(__bmp);
                }
        }
        
        /**
         * @copy BMPText#BMPText()
         */     
        public function setBMPAndText($allText:String, $width:int, $height:int, $transparent:Boolean, $direction:String, ...$bmds:Array):void
        {
                if($allText.length <= 0)
                        return;
                if($bmds == null || $bmds.length == 0)
                        return;
                _allText = $allText;
                _allTextLength = _allText.length;
                _bmpWidth = $width;
                _bmpHeight = $height;
                _transparent = $transparent;
                _direction = $direction;
                
                _textIndex = {};
                //如果提供的BitmapData的数量小于文本数量,就用第一个BitmapData进行分割
                if($bmds.length < _allTextLength)
                {
                        var __bmd1:BitmapData = BitmapData($bmds[0]);
                        if(__bmd1.width < _allTextLength*_bmpWidth)
                                throw new RangeError('提供的BitmapData的宽度不够切割成'+_allTextLength+'块!');
                        _slice = new BMPSlicer(__bmd1, _bmpWidth, _bmpHeight, $transparent, $direction, _allTextLength);
                        _bmdList = _slice.slicedBitmapDataList;
                        for(var i:int=0; i<_allTextLength; i++)
                        {
                                //保存对应每个文字的图片的索引
                                _textIndex[_allText.charAt(i)] = i;
                        }
                }
                //否则就认为每个参数都是一个与文本对应的BitmapData
                else
                {
                        _bmdList = new Vector.<Bitmap>(_allTextLength, true);
                        for(var j:int=0; j<_allTextLength; j++)
                        {
                                _bmdList[j] = BitmapData($bmds[j]);
                                //保存对应每个文字的图片的索引
                                _textIndex[_allText.charAt(j)] = j;
                        }
                }
        }
        
        /**
         * 使用当前的数据复制一个BMPText
         */     
        public function duplicate():BMPText
        {
                var __bmpt:BMPText = new BMPText();
                var __param:Array = [_allText, _bmpWidth, _bmpHeight, _transparent, _direction];
                __bmpt.setBMPAndText.apply(__bmpt, __param.concat(_bmdList));
                __bmpt.gap = _gap;
                __bmpt.text = _text;
                return __bmpt;
        }
        
        private function getTextBMP($txt:String):Bitmap
        {
                var __index:int = _textIndex[$txt];
                return new Bitmap(_bmdList[__index]);
        }
}
}







////////////////////////////////////////////////////////////////////////////////
//
//  zengrong.net
//  创建者:        zrong
//  最后更新时间:2010-12-07
//
////////////////////////////////////////////////////////////////////////////////
package org.zengrong.display
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Rectangle;

/**
 * 用于将一行宽度相同的连续位图按照固定的宽度和高度切成单独的块。
 * 例如:要使用0-9的数字图片,一个个载入比较浪费,可以将0-9拼在一张长条形的图片中,然后使用BMPSlicer来切割。
 * @author zrong
 */
public class BMPSlicer
{
        /**
         * 代表横向切割的常量 
         */     
        public static const VERTICAL:String = 'vertical';
        /**
         * 代表纵向切割的常量 
         */     
        public static const HORIZONTAL:String = 'horizontal';
        
        public static const ERROR_MSG_WIDTH:String = '请先定义切片的宽度。';
        public static const ERROR_MSG_HEIGHT:String = '请先定义切片的高度。';
        public static const ERROR_MSG_BITMAPDATA:String = '请先提供要切割的BitmapData。';
        
        /**
         * @param $bmd 要切割的BitmapData
         * @param $width 切片的宽度
         * @param $height 切片的高度
         * @param $transparent 切片是否透明
         * @param $direction 是横向切割还是纵向切割
         * @param $length 切片的数量
         */     
        public function BMPSlicer($bmd:BitmapData=null, $width:int=-1, $height:int=-1, $transparent:Boolean=true, $direction:String='horizontal', $length:int=-1)
        {
                _bmd = $bmd;
                _width = $width;
                _height = $height;
                _transparent = $transparent;
                _direction = $direction;
                _length = $length;
                if(_bmd && (_width>0) && (_height>0))
                        slice();
        }
        
        //--------------------------------------------------------------------------
        //
        //  实例变量
        //
        //--------------------------------------------------------------------------    
        protected var _bmd:BitmapData;
        protected var _width:int;
        protected var _height:int;
        protected var _transparent:Boolean;
        protected var _direction:String;
        protected var _length:int;
        
        /**
         * 保存切割好的BitmapData 
         */     
        protected var _bmdList:Vector.<BitmapData>;
        
        //--------------------------------------------------------------------------
        //
        //  getter方法
        //
        //--------------------------------------------------------------------------    
        
        /**
         * 返回切割好的BitmapData
         * @throw ReferenceError 如果没有执行过slice方法,就会抛出此异常。
         * @see #slice()
         */     
        public function get slicedBitmapDataList():Vector.<BitmapData>
        {
                if(!_bmdList)
                        throw new ReferenceError('切片列表还没有定义!请先执行BMPSlicer.slice方法。');
                return _bmdList;
        }
        
        /**
         * 根据索引返回要被切成片的BitmapData 
         * @param $index 切片在切片列表中的索引,从0开始
         */     
        public function getSlice($index:int):BitmapData
        {
                return _bmdList[$index];
        }

        /**
         * 根据索引返回被切成片的位图数据,并包装成Bitmap显示对象 
         * @param $index 切片在切片列表中的索引,从0开始
         */     
        public function getSlicedBMP($index:int):Bitmap
        {
                return new Bitmap(getSlice($index));
        }
        
        //--------------------------------------------------------------------------
        //
        //  setter方法
        //
        //--------------------------------------------------------------------------
        
        public function set bitmapData($bmd:BitmapData):void
        {
                _bmd = $bmd;
        }
        
        public function set width($width:int):void
        {
                _width = $width;
        }
        
        public function set height($height:int):void
        {
                _height = $height;
        }
        
        public function set transparent($transparent:Boolean):void
        {
                _transparent = $transparent;
        }
        
        public function set direction($direction:String):void
        {
                _direction = $direction;
        }
        
        public function set length($length:int):void
        {
                _length = $length;
        }
        
        //--------------------------------------------------------------------------
        //
        //  方法
        //
        //--------------------------------------------------------------------------
        /**
         * 执行切片动作 
         * @throw ReferenceError 如果必要的属性没有定义,就会抛出异常。
         */     
        public function slice():void
        {
                if(!_bmd)
                        throw new ReferenceError(ERROR_MSG_BITMAPDATA);
                if(_width < 0)
                        throw new ReferenceError(ERROR_MSG_WIDTH);
                if(_height < 0)
                        throw new ReferenceError(ERROR_MSG_HEIGHT);
                //如果没有传递$length值,就根据位图的宽度计算
                if(_length < 0)
                        _length = int(_bmd.width / _width);
                //根据长度建立一个固定长度的数组
                _bmdList = new Vector.<BitmapData>(_length, true);
                var __rect:Rectangle = new Rectangle(0, 0, _width, _height);
                var __pt:Point = new Point(0, 0);
                //新建一个BitmapData
                for(var i:int=0; i<_length; i++)
                {
                        var __newBmd:BitmapData = new BitmapData(_width, _height, _transparent);
                        if(_direction == HORIZONTAL)
                                __rect.x= i * _width;
                        else
                                __rect.y = i * _height;
                        __newBmd.copyPixels(_bmd, __rect, __pt);
                        _bmdList[i] = __newBmd;
                }
        }
}
}


  • 大小: 28.2 KB
分享到:
评论

相关推荐

    将24位位图转换成16位位图的源码

    将24位位图转换为16位位图的过程涉及色彩空间的压缩和优化,目的是减少文件大小,提高处理效率,尤其是在内存有限或者需要快速显示图像的场合。以下是这个过程中的关键步骤和知识点: 1. **读取24位位图**: 首先,...

    OpenGL下文字的显示.rar_C# 矢量文字_OPENGL位图_OpenGL显示文字_opengl文字_位图 矢量

    在OpenGL中,我们可以通过加载这些位图文件,然后在屏幕上定位和绘制每个字符来显示文字。这种方法简单易行,但缺点是分辨率依赖性强,放大后可能会显得模糊。 矢量文字,又称轮廓文字,是基于数学形状(如线条和...

    PDF转JPG——免费在线PDF转成图片格式

    免费在线PDF转成图片格式的服务通常提供了方便快捷的解决方案,无需安装任何软件。这些服务允许用户上传PDF文件,然后将其转换为一系列JPG图像。转换过程可能会涉及以下步骤: 1. **上传文件**:用户访问转换网站,...

    24位图转16位图工具

    本篇文章将详细探讨“24位图转16位图工具”所涉及的知识点。 首先,我们来了解24位BMP(BITMAP24)图像。24位BMP图像提供了8位红、8位绿和8位蓝通道,总共24位,能够显示约1670万种颜色,这被称为真彩色。这种格式...

    将ddb的位图转换成DIB的位图

    DDB与特定的显示器设备紧密相关,而DIB则可以在不同的设备上保持一致的显示效果,因此在需要跨设备或跨系统共享位图数据时,通常会使用DIB。 标题“将ddb的位图转换成DIB的位图”指的是在Visual Studio 2005中使用...

    彩色位图转成黑白位图

    本篇将详细介绍如何在Microsoft Visual C++(简称VC)环境下将彩色位图转换为单色位图,并涉及截图及生成位图数据文件的相关技术。 首先,我们需要理解位图的基本结构。在Windows API中,位图通常通过...

    位图的读取、显示和图像处理

    本文将详细讲解位图的基本概念、如何读取和显示位图,以及进行简单的图像处理,包括离散余弦变换(DCT)和中值滤波。 位图,也称为栅格图像,是一种像素阵列表示的图像格式,每个像素对应一个颜色值。常见的位图...

    在按钮上使用位图和文字

    本主题将深入探讨如何在按钮上同时显示位图和文字,这对于创建有吸引力且易于理解的用户交互至关重要。 1. **创建自定义按钮** - 使用`CreateWindowEx`函数可以创建一个具有特定样式和属性的自定义按钮。通过设置`...

    flash动画优化——位图淘汰机制

    flash动画优化——位图淘汰机制 Bitmap对象是flash中渲染速度最快的,同时它还有一个特点是多个Bitmap实例可以共用同一个BitmapData对象,在这种情况下,多个Bitmap实例和单个Bitmap实例所占用的内存相差无几。 ...

    delphi将文本转换成位图图片

    在Delphi编程环境中,将文本转换为位图图片是一项常见的需求,特别是在创建个性化标识或制作身份证件时。本文将深入探讨如何使用Delphi实现这一功能,以及涉及的关键知识点。 首先,我们要了解位图图片(Bitmap)是...

    《Visual C++范例大全》随书光盘 第七章

    实例152——显示倾斜的文字 实例153——制作滚动的字幕 实例154——获取系统中已安装的所有字体 实例155——使用不同的画笔绘制图形 实例156——使用不同类型的画刷填充矩形 实例157——使用CRgn对象得到某一...

    把位图转换为点阵软件 用于点阵屏幕图像显示

    位图与点阵转换在IT领域中是一种常见的图像处理技术,尤其在电子设备显示和嵌入式系统中扮演着重要角色。位图是图像的一种基本形式,由像素组成,每个像素都有自己的颜色值,可以存储丰富的图像信息。点阵则是将位图...

    VC代码 透明位图显示——背景透明

    在计算机图形学中,透明位图是一种特殊类型的图像,它允许背景透过图像的某些部分显示出来,从而实现图像与背景的自然融合。在VC(Visual C++)编程环境中,实现透明位图显示是一项常见的任务,尤其在开发GUI(图形...

    Flex 游戏入门级----------------位图切割,人物行走

    位图切割是将大的图像资源分割成多个小的、可独立操作的部分,这在游戏开发中非常常见,尤其对于人物角色或复杂的背景。在 Flex 中,我们可以使用 BitmapData 对象来完成这项工作。以下步骤概述了位图切割的基本过程...

    android 位图转单色位图

    在Android开发中,有时我们需要将彩色的位图(Bitmap)转换为单色位图,以实现特定的效果,比如创建简单的二值化图像、节省内存或提高处理速度。本篇文章将详细探讨如何在Android中进行这种转换,从32位深图和24位深...

    安卓Android源码——(动态位图).zip

    本资料“安卓Android源码——(动态位图).zip”很可能包含了深入解析Android系统如何处理动态位图的相关源代码和分析。以下是关于这个主题的一些核心知识点: 1. **Bitmap类**:Bitmap是Android中用于存储像素数据的...

    安卓Android源码——(动态位图).rar

    当一个ImageView或自定义视图加载了动态位图后,系统会根据帧速率和时间戳来决定何时更新显示的帧。这个过程涉及到Android的 Choreographer 类,它负责调度每一帧的绘制,确保画面流畅无卡顿。 在Android源码中,...

    C#生成单色位图的方法.zip_C# 单色位图_C# 单色位图_C# 图片转单色_c#单色位图

    本教程将详细解释如何使用C#来生成单色位图,并且添加信息头,使得图像更加规范且易于处理。 首先,我们要了解位图的基本概念。位图是由像素组成的,每个像素可以有一个特定的颜色值。在单色位图中,通常只有两种...

    bmp位图转十六进制

    总的来说,"bmp位图转十六进制"是一个实用的技术,它使得开发者能够在资源受限的环境中实现图形显示。文件"BMP2C"很可能是完成这个转换的程序或脚本,用于生成可以直接在C语言环境中编译和运行的代码。对于那些涉及...

    易语言字节集转位图功能源码

    6. **显示或保存图像**:最后,可以在窗口上显示这个位图,或者使用“写入文件”命令将其保存为图像文件。 三、位图转字节集的过程 1. **加载位图**:使用“打开图形文件”命令加载位图文件,获取其位图对象。 2....

Global site tag (gtag.js) - Google Analytics