это (я думаю) относительно простой математический вопрос, но я провел целый день, стуча по нему головой и у меня есть только вмятины и никакого решения ...
Я кодирую в ActionScript 3 - функциональность:
большое изображение, загруженное во время выполнения. BitmapData сохраняется, и создается уменьшенная версия для отображения в доступной области экрана (я могу в конечном итоге просто масштабировать большое изображение, поскольку оно в любом случае находится в памяти).
Пользователь может создать прямоугольную точку доступа на меньшем изображении (функциональность будет более сложной: многократные перья с прозрачностью: пример формы пончика с отверстием и т. Д.)
3 Когда пользователь нажимает на горячую точку, прямоугольник горячей точки сопоставляется с большим изображением, и создается новое растровое изображение «выноска» с использованием больших растровых данных. Причиной этого является то, что «выноска» будет более качественной, чем просто увеличение области горячей точки.
На изображении ниже показано, где я нахожусь - синий прямоугольник - это горячая точка, по которой щелкают. В левом верхнем углу находится «выноска» - скопированная с большего изображения. У меня правильное соотношение сторон, но я неправильно сопоставляю изображение большего размера.
Гадкий код ниже ... Извините, этот пост такой длинный - я просто решил, что должен предоставить как можно больше информации. Спасибо за любые советы!
- трассировка значений моих данных
* источник BitmapDada 1152 864
масштабировано до прямоугольного 800 600
масштабированный BitmapData 800 600
выбор BitmapData 58 56
масштабированный выбор 83 80
Соотношение 1,44
до (х = 544, у = 237, ш = 58, ч = 56)
(х = 544, у = 237, ш = 225,04, ч = 217,28)
*
Изображение здесь: http://i795.photobucket.com/albums/yy237/skinnyTOD/exampleST.jpg
public function onExpandCallout(event:MouseEvent):void{
if (maskBitmapData.getPixel32(event.localX, event.localY) != 0){
var maskClone:BitmapData = maskBitmapData.clone();
//amount to scale callout - this will vary/can be changed by user
var scale:Number =150 //scale percentage
var normalizedScale :Number = scale/=100;
var w:Number = maskBitmapData.width*normalizedScale;
var h:Number = maskBitmapData.height*normalizedScale;
var ratio:Number = (sourceBD.width /targetRect.width);
//creat bmpd of the scaled size to copy source into
var scaledBitmapData:BitmapData = new BitmapData(maskBitmapData.width * ratio, maskBitmapData.height * ratio, true, 0xFFFFFFFF);
trace("source BitmapDada " + sourceBD.width, sourceBD.height);
trace("scaled to rect " + targetRect.width, targetRect.height);
trace("scaled BitmapData", bkgnImageSprite.width, bkgnImageSprite.height);
trace("selection BitmapData", maskBitmapData.width, maskBitmapData.height);
trace("scaled selection", scaledBitmapData.width, scaledBitmapData.height);
trace("ratio", ratio);
var scaledBitmap:Bitmap = new Bitmap(scaledBitmapData);
var scaleW:Number = sourceBD.width / scaledBitmapData.width;
var scaleH:Number = sourceBD.height / scaledBitmapData.height;
var scaleMatrix:Matrix = new Matrix();
scaleMatrix.scale(ratio,ratio);
var sRect:Rectangle = maskSprite.getBounds(bkgnImageSprite);
var sR:Rectangle = sRect.clone();
var ss:Sprite = new Sprite();
ss.graphics.lineStyle(8, 0x0000FF);
//ss.graphics.beginFill(0x000000, 1);
ss.graphics.drawRect(sRect.x, sRect.y, sRect.width, sRect.height);
//ss.graphics.endFill();
this.addChild(ss);
trace("before " + sRect);
w = uint(sRect.width * scaleW);
h = uint(sRect.height * scaleH);
sRect.inflate(maskBitmapData.width * ratio, maskBitmapData.height * ratio);
sRect.offset(maskBitmapData.width * ratio, maskBitmapData.height * ratio);
trace(sRect);
scaledBitmapData.copyPixels(sourceBD, sRect, new Point());
addChild(scaledBitmap);
scaledBitmap.x = offsetPt.x;
scaledBitmap.y = offsetPt.y;
}
}