AS3 - создать новые bitmapData с не целыми шириной и высотой - PullRequest
0 голосов
/ 11 октября 2011

Эй, ребята, надеясь, что кто-то может помочь здесь. Я обрезаю растровое изображение на плитки, используя следующую функцию:

function crop( _x:Number, _y:Number, _width:Number, _height:Number, callingScope:MovieClip, displayObject:DisplayObject = null, pixelSnapping:Boolean = false):Bitmap
{
    var cropArea:Rectangle = new Rectangle( 0, 0, _width, _height );
    var croppedBitmap:Bitmap;

    if(pixelSnapping == true)
    {
        croppedBitmap = new Bitmap( new BitmapData( _width, _height ), PixelSnapping.ALWAYS, true );
    }
    else
    {
        croppedBitmap = new Bitmap( new BitmapData( _width, _height ), PixelSnapping.NEVER, true );
    }

    croppedBitmap.bitmapData.draw( (displayObject!=null) ? displayObject : callingScope.stage, new Matrix(1, 0, 0, 1, -_x, -_y) , null, null, cropArea, true );

    return croppedBitmap;
}

Ширина и высота, которые передаются, не являются целочисленными значениями, например, 18,75. Когда создается новый BitmapData, он всегда округляет значение до целого числа, поскольку аргументы для BitmapData печатаются как таковые. В случае моих потребностей ширина и высота вряд ли будут целыми числами. Есть ли способ создать эти фрагменты растрового изображения другого изображения с точной шириной и высотой, которые мне нужны, или можно создавать новые bitmapData только с целочисленными значениями для высоты и ширины?

Спасибо за понимание.

РЕДАКТИРОВАТЬ: Я понимаю, что вы не можете иметь доли пикселя, но ... Я пытаюсь добиться разделения изображения на плитки. Я хочу, чтобы количество плиток было переменным, скажем, 4 строки на 4 столбца или 6 строк на 8 столбцов. деление изображения на количество частей X приводит к тому, что ширина и высота в большинстве случаев не являются целочисленными значениями, например, 18,75. Цель состоит в том, чтобы разделить изображение на плитки, и чтобы это изображение появлялось, собравшись без проблем, над исходным изображением, где я затем манипулировал отдельными плитами для различных целей (игра-головоломка, мозаичная анимация для новой сцены и т. Д.). Мне нужно, чтобы изображение, собранное из всех частей плитки, было точной копией исходного изображения, без линий между плитками или белыми краями где-либо, и мне нужно, чтобы это происходило с нецелыми значениями ширины и высоты для частей bitmapData которые составляют плитки. Имеет ли это смысл? O_o

Ответы [ 2 ]

1 голос
/ 11 октября 2011

BitmapData может быть создан только с целочисленными значениями для измерений.

И, честно говоря, я пытаюсь представить, как будет выглядеть объект BitmapData с плавающими числами для измерений, но мой мозг начинает кричать от боли: НЕ СМЫСЛ!

Мой мозг иногда немного мелодраматичен.

- РЕДАКТИРОВАТЬ - Ответ на отредактированный вопрос:

2 варианта:

1 / Просто скопируйте исходные полные растровые данные столько раз, сколько у вас есть плиток, а затем используйте маски на растровых объектах для отображения соответствующих частей плиток

2 / убедитесь, что срезы не генерируют дробную ширину или высоту. Например, если у вас есть изображение шириной 213, которое вы хотите разделить на 2 строки и 2 столбца, то установите ширину левой плитки на 106, а ширину правой плитки на 107

.

Возможно, есть и другие варианты, но мне кажется, что эти два варианта самые легкие с наибольшей вероятностью успеха.

0 голосов
/ 12 октября 2011

Если вам нужно создать плитки с предпочтительным размером, вы можете использовать что-то вроде этого:

private function CreateTilesBySize( bigImage:Bitmap, preferredTileWidth:int, preferredTileHeight:int ):Tiles
{
  var result:Tiles = new Tiles();
  var y:int = 0;
  while ( y < bigImage.height ) {
    result.NewRow();
    const tileHeight:int = Math.min( preferredTileHeight, bigImage.height - y );
    var x:int = 0;
    while ( x < bigImage.width ) {
      const tileWidth:int = Math.min( preferredTileWidth, bigImage.width - x );
      const tile:Bitmap = Crop( x, y, tileWidth, tileHeight, bigImage );
      result.AddTile( tile );
      x += tileWidth;
    }
    y += tileHeight;
  }
  return result;
}

Если вам нужно создать точное количество строк и вызовов.Тогда вы можете использовать:

private function CreateTilesByNum( bigImage:Bitmap, cols:int, rows:int ):Tiles
{
  const preferredTileWidth:int = Math.ceil( bigImage.width / cols );
  const preferredTileHeight:int = Math.ceil( bigImage.height / rows );
  return CreateTilesBySize( bigImage, preferredTileWidth, preferredTileHeight );
}

Но помните, что плитки будут иметь разные размеры (последние плитки в строке и последние плитки в столбце)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...