कहें कि मेरे पास 600x600 का बिटमैपडाटा है और मैं इसे 100x100 तक स्केल करना चाहता हूं।बिटमैपडेटा ऑब्जेक्ट का आकार बदलने का सबसे अच्छा तरीका क्या है?
उत्तर
यह काम करता है:
var scale:Number = 1.0/6.0;
var matrix:Matrix = new Matrix();
matrix.scale(scale, scale);
var smallBMD:BitmapData = new BitmapData(bigBMD.width * scale, bigBMD.height * scale, true, 0x000000);
smallBMD.draw(bigBMD, matrix, null, null, null, true);
var bitmap:Bitmap = new Bitmap(smallBMD, PixelSnapping.NEVER, true);
कोड लिखने के बिना। जिस तरह से मैं इस पर पहुंचूंगा वांछित आकार की एक नई बिटमैपडाटा ऑब्जेक्ट बनाना होगा और फिर बड़े को कॉपी करने के लिए bitmap.draw विधि का उपयोग करना होगा। Bitmap.draw विधि एक मैट्रिक्स तर्क भी स्वीकार करता है जिसे आप कॉपी करते समय स्केल करने के लिए उपयोग कर सकते हैं।
public function drawScaled(obj:IBitmapDrawable, thumbWidth:Number, thumbHeight:Number):Bitmap {
var m:Matrix = new Matrix();
m.scale(WIDTH/obj.width, HEIGHT/obj.height);
var bmp:BitmapData = new BitmapData(thumbWidth, thumbHeight, false);
bmp.draw(obj, m);
return new Bitmap(bmp);
}
IBitmapDrawable DisplayObject और BitmapData के लिए एक इंटरफेस है।
से: मैट्रिक्स स्केलिंग का उपयोग कर के साथ समस्या यह http://www.nightdrops.com/2009/02/quick-reference-drawing-a-scaled-object-in-actionscript/
कि यह किसी भी एंटीलायज़िंग़ या चौरसाई ऐसा नहीं करता है - यह अगर आप वाकई होगा ही कभी downscaling किया गया हो शायद ठीक है, लेकिन एक अधिक सामान्य विधि आकार बदलने के लिए छवि वर्ग का उपयोग करेंगे। एएस 3 में इसे कभी भी डिस्प्ले सूची में नहीं जोड़ा जाएगा, इसलिए इसका उपयोग "ऑफस्क्रीन" किया जाएगा। (के रूप में "sourceBitmapData" अपने बिटमैप डेटा के साथ) कुछ इस तरह:
var image:Image = new Image();
image.load(new Bitmap(sourceBitmapData, PixelSnapping.NEVER, true));
var scale:uint = 100/600; // this is from your example of 600x600 => 100x100
var scaledWidth:uint = sourceBitmapData.width * scale;
var scaledHeight:uint = sourceBitmapData.height * scale;
image.content.width = scaledWidth;
image.content.height = scaledHeight;
var scaledBitmapData:BitmapData = new BitmapData(scaledWidth, scaledHeight);
scaledBitmapData.draw(image.content);
image = null;
फिर आप "scaledBitmapData" का उपयोग कर सकते हैं "sourceBitmapData" के स्थान पर जो कुछ के साथ क्या करना।
दोनों द्वारा उपयोग किया जाता है यह छवि वर्ग कहां से आता है? http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/index.html?filter_flashplayer=10.1 एएस 3 लाइब्रेरी का हिस्सा होने के रूप में एक छवि वर्ग को सूचीबद्ध नहीं करता है। – Dwayne
छवि वर्ग – Jotham
के संदर्भ के रूप में नीचे वोट दिया गया है यह या तो http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/Image.html या http://help.adobe.com है /en_US/FlashPlatform/reference/actionscript/3/spark/components/Image.html –
:
function BitmapScaled(source:IBitmapDrawable, thumbWidth:Number, thumbHeight:Number):BitmapData {
var mat:Matrix = new Matrix();
mat.scale(thumbWidth/source.width, thumbHeight/source.height);
var bmpd_draw:BitmapData = new BitmapData(thumbWidth, thumbHeight, false);
bmpd_draw.draw(source, mat, null, null, null, true);
return bmpd_draw;
}
ड्रा विधि IBitmapDrawable जो DisplayObject और BitmapData के लिए एक इंटरफेस है स्वीकार करता है।
यहां उपरोक्त की एक भिन्नता है जो ज़ूम, खिंचाव और लेटरबॉक्स के लिए समर्थन जोड़ती है। यह क्लिपिंग समर्थन प्रदान नहीं कर सकता है।
var newSizeBitmapData:BitmapData = resizeBitmapData(myBitmapData, newWidth, newHeight);
/**
* Resize display object or bitmap data to a new size
**/
public static function resizeBitmapData(bitmapDrawable:IBitmapDrawable, width:Number, height:Number, scaleMode:String="none",
smooth:Boolean = true, transparent:Boolean = true, fillColor:Number = 0x00000000):BitmapData {
var sizedBitmapData:BitmapData;
var matrix:Matrix;
matrix = getSizeByScaleMode(width, height, Object(bitmapDrawable).width, Object(bitmapDrawable).height, scaleMode);
sizedBitmapData = new BitmapData(width, height, transparent, fillColor);
sizedBitmapData.draw(bitmapDrawable, matrix, null, null, null, smooth);
return sizedBitmapData;
}
// Get correct scale. Inspired from code in Apache Flex (license Apache 2.0)
public static function getSizeByScaleMode(maxWidth:int, maxHeight:int,
width:int, height:int,
scaleMode:String="letterbox",
dpi:Number=NaN):Matrix {
var aspectRatio:String = (maxWidth < maxHeight) ? "portrait" : "landscape";
var orientation:String = aspectRatio;
var matrix:Matrix = new Matrix();
var scaleX:Number = 1;
var scaleY:Number = 1;
switch(scaleMode) {
case "zoom":
scaleX = Math.max(maxWidth/width, maxHeight/height);
scaleY = scaleX;
break;
case "letterbox":
scaleX = Math.min(maxWidth/width, maxHeight/height);
scaleY = scaleX;
break;
case "stretch":
scaleX = maxWidth/width;
scaleY = maxHeight/height;
break;
}
if (scaleX != 1 || scaleY != 0) {
width *= scaleX;
height *= scaleY;
matrix.scale(scaleX, scaleY);
}
matrix.translate(-width/2, -height/2);
matrix.translate(maxWidth/2, maxHeight/2);
return matrix;
}
पूरी तरह से काम करता है, धन्यवाद! –
यह '0x000000' बहुत महत्वपूर्ण है, इसके बिना कोई पारदर्शीता नहीं है – Cherniv