AS3 — создать новые растровые данные с нецелыми шириной и высотой

#actionscript-3

#actionscript-3

Вопрос:

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

 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 вводятся как таковые. В случае моих потребностей здесь ширина и высота вряд ли когда-либо будут целыми числами. Есть ли способ создать эти растровые фрагменты другого изображения с точной шириной и высотой, которые мне нужны, или можно создать новые растровые данные только с целочисленными значениями высоты и ширины?

Спасибо за любую информацию.

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

Комментарии:

1. Растровые данные состоят из пикселей. Точное количество пикселей — ширина * высота. Пиксели — это цветовая точка. BitmapData — это не визуальный элемент. Речь идет о том, как визуальный элемент хранится в памяти. Не может быть и половины этого количества информации. Пожалуйста, объясните цель, которую вы пытаетесь достичь, чтобы мы могли предложить лучшее решение.

2. отредактировал мой ответ, чтобы ответить на ваш отредактированный вопрос

3. Поскольку не существует волшебной формулы, которая могла бы разделить, скажем, 5 на 2 без остатка, то вам придется дополнить, обрезать или масштабировать изображение, чтобы вычислить целое число. Конечно, это не будет точной копией.

Ответ №1:

Растровые данные могут быть созданы только с целочисленными значениями для измерений.

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

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

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

2 варианта:

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

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

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

Ответ №2:

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

 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 resu<
}
  

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

 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 );
}
  

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