附图说明
图1为本发明所提出的图像的缩放方法的总体流程图;
图2为本发明确定处理方式的流程图;
图3为本发明的中间格式信息的示意图;
图4为本发明Symbolic command的流程图;及
图5为本发明Bitmap Rendering的流程图。
其中,图中:
步骤110确定源图像到目标图像的缩放倍数,并根据该缩放倍数确定源图像中的像素在该目标图像中的相应坐标
步骤120逐行扫描该源图像,同时将具有相同像素值的相邻像素合并成像素块
步骤130根据该像素块在该目标图像中的坐标,确定该像素块的中间格式信息
步骤140根据该中间格式信息,将相应的像素挂网成网点图生成相应的位图图像
步骤210获得源图像的宽度与高度
步骤220获得目标图像的宽度与高度
步骤230分别计算图像的宽度与高度的缩放比例
步骤240根据该宽度与高度的缩放比例计算整体缩放倍数
步骤250大于缩放倍数阈值?
步骤260选择Symbolic command图像处理方式
步骤270选择Bitmap Rendering图像处理方式
310 命令标识
320 像素值
330 像素块左上角X坐标值
340 像素块左上角Y坐标值
350 像素右下角X坐标值
360 像素右下角Y坐标值
步骤410根据缩放倍数确定源图像中的像素在该目标图像中的相应坐标
步骤420逐行扫描图像点
步骤430将具有相同像素值的相邻像素合并成像素块
步骤440根据像素块确定中间格式信息
步骤450获取图像的各行像素块的中间格式信息
步骤460逐行根据中间格式信息对图像作Halftone Rendering处理
步骤470将生成的位图,直接存储到系统视频缓冲区中
步骤510根据目标图像大小分配出系统内存
步骤520根据缩放倍数确定源图像中的像素在该目标图像中的相应坐标
步骤530逐行扫描图像点
步骤540将具有相同像素值的相邻像素合并成像素块
步骤550确定像素块的中间格式信息
步骤560对像素块作Halftone rendering处理
步骤570将生成的目标位图存储在分配到的相应内存块中
具体实施方式
本发明为一种图像的缩放方法,首先由图1中说明本发明的方法,说明如下:
首先确定源图像到目标图像的缩放倍数,并根据该缩放倍数确定源图像中的像素在该目标图像中的相应坐标(步骤110),然后逐行扫描该源图像,同时将具有相同像素值的相邻像素合并成像素块(步骤120),根据该像素块在该目标图像中的坐标,确定该像素块的中间格式信息(步骤130),根据该中间格式信息,将相应的像素挂网成网点图(Halftone),生成相应的位图图像(步骤140)。
对于一幅待处理的图像其像素色彩空间可能是RGB,CMYK,Gray等,因而会有不同的色彩平面,本发明提供的方法,对不同的色彩平面可作相同的处理,并可最终生成各色彩平面的Bitmap信息。
请参见图2,首先根据获得源图像的宽度与高度(步骤210),再获得目标图像的宽度与高度(步骤220),然后根据放大倍数确定图像在X及Y方向上的缩放比例(步骤230),从而得出目标区域中相应像素的坐标位置。具体方法为设第一行第一个像素的左上角X,Y坐标值为(X0,Y0),根据图像在X及Y方向上的缩放比例,经计算后,在目标系统设备坐标系行进步长分别为ΔX,ΔY。设源图像宽为SrcWidth,高为SrcHeight,目标图像宽为DesWidth,高为DesHeight,图像在X及Y方向上的缩放比例为xScale,yScale,整体缩放比例为ScaleRate,因此有:
ΔX=xScale=DesWidth/SrcWidth
ΔY=yScale=DesHeight/SrcHeight
可得出整体缩放比例ScaleRate=xScale*yScale(步骤240)
然后将整体放大倍数与放大倍数阈值相比较(步骤250),如果大于该阈值,则选择Symbolic command图像处理方式(步骤260),否则选择BitmapRendering图像处理方式(步骤270)。
下面以8x8灰度单平面像素图像为例对本发明进行详细说明,首先设定放大倍数阈值,本实施例的放大倍数阈值为96。(用户可根据系统内存配置大小,设定放大倍数阈值)。
8x8灰度像素图像的灰度值如下图所示:
0x23 |
0x15 |
0x15 |
0x60 |
0x17 |
0x23 |
0x23 |
0x72 |
0x11 |
0x27 |
0x27 |
0x27 |
0x43 |
0x56 |
0x21 |
0x18 |
0xa3 |
0x89 |
0xb2 |
0x19 |
0x19 |
0x68 |
0xa7 |
0xa3 |
0x38 |
0x42 |
0x46 |
0xb3 |
0xa1 |
0xc5 |
0xd0 |
0x80 |
0x81 |
0x82 |
0xb6 |
0xb0 |
0x88 |
0x88 |
0x65 |
0x65 |
0x70 |
0x71 |
0x36 |
0x36 |
0xc8 |
0xa9 |
0xe1 |
0x70 |
0x61 |
0x80 |
0x20 |
0x25 |
0x49 |
0x50 |
0x51 |
0x55 |
0x73 |
0x73 |
0xb2 |
0xa1 |
0x85 |
0x85 |
0x85 |
0x85 |
首先计算图像的整体放大倍数,原8x8灰度像素图像将在X及Y方向上的放大比例分别为12,10,因此整体放大倍数为12*10=120,然后将整体放大倍数120与放大倍数阈值96相比较,由于大于该阈值,因此选择Symboliccommand图像处理方式,Symbolic command处理方式的像素块中间格式信息,如图3所示,该命令格式占用3个“long”,共计96Bits;第一个long存放“命令标识310及像素灰度值320”信息,第二个long存放“该像素左上角X坐标值330及Y坐标值340”信息,第三个long存放“该像素右下角X坐标值350及Y坐标值360”信息。若用公知的处理方法,将8x8灰度像素图像放大120倍数,需用内存(8*12)*(8*10)/8=960Bytes.若用本发明的Symbolic command图像处理方式,将8x8灰度像素图像放大120倍数,当每一行内像素灰度值均不同时,存储一个像素需用3*32=96Bits,图像总共8*8=64Pixels,因此需用内存(64*96)/8=768Bytes。当一行内相邻像素灰度值有相同情形时,则可用3个“long”记住多个像素信息,此时,所需用内存比768Bytes更少。将8x8灰度像素图像放大120倍,使用Symboliccommand图像处理方式,至少可节省192Bytes,对于更大的图像,可节省更多的系统内存。
确定了图像的处理方式后,就可以对图像进行相应的处理,请参见图4,该图为本发明Symbolic command的流程图。首先根据该缩放倍数确定源图像中的像素在该目标图像中的相应坐标(步骤410),然后对图像点进行逐行扫描(步骤420),将具有相同像素值的相邻像素合并成像素块(步骤430),当一行内相邻像素值有相同情形时,则相同像素合并成个一个像素,并进行处理区域扩充,从图像第一行第一个像素开始逐行扫描。根据像素块确定中间格式信息(步骤440),中间格式信息包括像素块的命令标识,在此例中,设定为0x80000000、该像素块左上角坐标位置以及该像素块右下角坐标位置。
扫描得第一个像素值为0x23,第一个像素的左上角X,Y坐标值为(X0,Y0),右下角X,Y坐标值为(X0+ΔX,Y0+ΔY),扫描得第二个像素值为0x15,与前者不同,故可得第一个Symbolic command为:
0x80000023 |
(X0,Y0) |
(X0+ΔX,Y0+ΔY) |
第二个像素的左上角X,Y坐标值为(X0+ΔX,Y0),右下角X,Y坐标值为(X0+ΔX+ΔX,Y0+ΔY)=(X0+2ΔX,Y0+ΔY),扫描得第三个像素值为0x15,与前者相同,此时,第三个像素的左上角X,Y坐标值为(X0+ΔX+ΔX,Y0)=(X0+2ΔX,Y0),右下角X,Y坐标值为(X0+ΔX+ΔX+ΔX,Y0+ΔY)=(X0+3ΔX,Y0+ΔY),第二、三个像素合并成一个大像素,扫描得第四个像素值为0x60,与前者不同,故可得第二个Symbolic command为:
0x80000015 |
(X0+ΔX,Y0) |
(X0+3ΔX,Y0+ΔY) |
第四个像素的左上角X,Y坐标值为(X0+3ΔX,Y0),右下角X,Y坐标值为(X0+4ΔX,Y0+ΔY),扫描得第五个像素值为0x17,与前者不同,故可得第三个Symbolic command为:
0x80000060 |
(X0+3ΔX,Y0) |
(X0+4ΔX,Y0+ΔY) |
第五个像素的左上角X,Y坐标值为(X0+4ΔX,Y0),右下角X,Y坐标值为(X0+5ΔX,Y0+ΔY),扫描得第六个像素值为0x23,与前者不同,故可得第四个Symbolic command为:
0x800000017 |
(X0+4ΔX,Y0) |
(X0+5ΔX,Y0+ΔY) |
第六个像素的左上角X,Y坐标值为(X0+5ΔX,Y0),右下角X,Y坐标值为(X0+6ΔX,Y0+ΔY),扫描得第七个像素值为0x23,与前者不同,此时,第七个像素设的左上角X,Y坐标值为(X0+6ΔX,Y0),右下角X,Y坐标值为(X0+7ΔX,Y0+ΔY),扫描得第八个像素值为0x72,与前者不同,故可得第五个Symbolic command为:
0x80000023 |
(X0+5ΔX,Y0) |
(X0+7ΔX,Y0+ΔY) |
第八个像素的左上角X,Y坐标值为(X0+7ΔX,Y0),右下角X,Y坐标值为(X0+8ΔX,Y0+ΔY),由于是该行最后一个像素,故可得第六个Symboliccommand为:
0x800000072 |
(X0+7ΔX,Y0) |
(X0+8ΔX,Y0+ΔY) |
扫描图像第二行像素,可得六个Symbolic command分别如下:
0x80000011 |
(X0,Y0+ΔY) |
(X0+ΔX,Y0+2ΔY) |
0x80000027 |
(X0+ΔX,Y0+ΔY) |
(X0+4ΔX,Y0+2ΔY) |
0x80000043 |
(X0+4ΔX,Y0+ΔY) |
(X0+5ΔX,Y0+2ΔY) |
0x80000056 |
(X0+5ΔX,Y0+ΔY) |
(X0+6ΔX,Y0+2ΔY) |
0x80000021 |
(X0+6ΔX,Y0+ΔY) |
(X0+7ΔX,Y0+2ΔY) |
0x800000018 |
(X0+7ΔX,Y0+ΔY) |
(X0+8ΔX,Y0+2ΔY) |
扫描图像第3,4,5,6,7,8行像素,总共可生成52个Symbolic command,占用内存(52*96)/8=624Bytes,比公知直接生成位图法节省336Bytes(960-624)。
在系统需要生成黑白位图图像(Bitmap)时,获取图像的各行像素Symbolic command信息(步骤450),对于不同像素,逐行根据中间格式信息对图像,根据该像素的左上角、右下角XY坐标值,及像素值作HalftoneRendering处理(步骤460),并将生成的位图,直接存储到系统视频缓冲区中(步骤470),以加快图像处理速度,并有效地使用系统内存。
请参见图5,当原8x8灰度像素图像将在X及Y方向上的放大比例分别为8,8时,图像的整体放大倍数为8*8=64。将图像整体放大倍数64与放大倍数阈值96相比较,由于小于该阈值,此时选择Bitmap rendering图像处理方式,因为用此处理方式一个像素占用内存64Bits,而用Symboliccommand图像处理方式则需占用96Bits。根据图像缩放后目标图像大小分配一大块系统内存用以存储生成的Bitmap(步骤510),如果因为系统存在内存碎片,而无法分配到一整大块内存时,此时,采用分块存储方案,即将目标区域大小分割成2小块区域,再分别申请内存,若存在申请不到的情形,则再将未成功小块区域2分成更小的区域进行内存申请,用此方法,可将所需的存储Bitmap内存分块申请到。例如,假定目标区域大小为800Kbytes,第一次,按800Kbytes大小向系统申请内存,若分配不成功,将800Kbytes分成2个400Kbytes再次分别申请,第二次,按400Kbytes大小向系统申请2块内存,若分配400Kbytes成功一块,另一块分配400Kbytes不成功,将不成功的一块400Kbytes分成2个200Kbytes再次分别申请,第三次,按200Kbytes大小向系统申请2块内存,若分配2块200Kbytes均分配成功,则完成Bitmaprendering内存分配任务,否则重复上述过程,直至申请到所需的内存。
然后根据图像的放大倍数确定ΔX以及ΔY,根据ΔX以及ΔY确定源图像中的像素在该目标图像中的相应坐标(步骤520),逐行扫描所有图像点(步骤530),当一行内相邻像素值有相同情形时,则相同像素合并成个一像素块(步骤540),扫描过程如同Symbolic command方式,确定像素块的中间格式信息(步骤550),根据该中间格式信息作Halftone rendering处理(步骤560)生成目标Bitmap,并存储在分配到的相应内存块中(步骤570)。
将像素块、只是扫描结果处理方式不同,一个是生成图像像素Symboliccommand,一个是进一步作Halftone rendering处理生成目标Bitmap,并存储在分配到的相应内存块中。
对于图像第一行的像素,Bitmap rendering处理方式如下:
对区域(X0,Y0)、(X0+ΔX,Y0+ΔY),作像素值为0x23的Halftonerendering处理并生成Bitmap存储到该行对应的内存块中;
合并第2,3个像素,对区域(X0+ΔX,Y0)、(X0+3ΔX,Y0+ΔY),作像素值为0x15的Halftone rendering处理并生成Bitmap存储到该行对应的内存块中;
对区域(X0+3ΔX,Y0)、(X0+4ΔX,Y0+ΔY),作像素值为0x60的Halftonerendering处理并生成Bitmap存储到该行对应的内存块中;
对区域(X0+4ΔX,Y0)、(X0+5ΔX,Y0+ΔY),作像素值为0x17的Halftonerendering处理并生成Bitmap存储到该行对应的内存块中;
合并第6,7个像素,对区域(X0+5ΔX,Y0)、(X0+7ΔX,Y0+ΔY),作像素值为0x23的Halftone rendering处理并生成Bitmap存储到该行对应内存块中;
对区域(X0+7ΔX,Y0)、(X0+8ΔX,Y0+ΔY),作像素值为0x72的Halftonerendering处理并生成Bitmap存储到该行对应的内存块中;
对于图像第二行的像素,Bitmap rendering处理方式如下:
对区域(X0,Y0+ΔY)、(X0+ΔX,Y0+2ΔY),作像素值为0x11的Halftonerendering处理并生成Bitmap存储到该行对应的内存块中;
合并第2,3,4个像素,对区域(X0+ΔX,Y0+ΔY)、(X0+4ΔX,Y0+2ΔY),作像素值为0x27的Halftone rendering处理并生成Bitmap存储到该行对应的内存块中;
对区域(X0+4ΔX,Y0+ΔY)、(X0+5ΔX,Y0+2ΔY),作像素值为0x43的Halftone rendering处理并生成Bitmap存储到该行对应的内存块中;
对区域(X0+5ΔX,Y0+ΔY)、(X0+6ΔX,Y0+2ΔY),作像素值为0x56的Halftone rendering处理并生成Bitmap存储到该行对应的内存块中;
对区域(X0+6ΔX,Y0+ΔY)、(X0+7ΔX,Y0+2ΔY),作像素值为0x21的Halftone rendering处理并生成Bitmap存储到该行对应的内存块中;
对区域(X0+7ΔX,Y0+ΔY)、(X0+8ΔX,Y0+2ΔY),作像素值为0x18的Halftone rendering处理并生成Bitmap存储到该行对应的内存块中;
用相同的方法扫描图像第3,4,5,6,7,8行像素,作像素Halftonerendering处理并生成Bitmap存储到该行对应的内存块中。
虽然本发明以前述的较佳实施例公开如上,然其并非用以限定本发明,故任何本领域技术人员,在不脱离本发明的精神和范围内,可作一些的变动与改进,因此本发明的保护范围以权利要求为准。