Сдвиньте первые 4 бита вправо на изображении C ++ [duplicate]

ЗАПИСЬ ИЗОБРАЖЕНИЙ

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

Вот таблица из Adobe сайт :

  • По умолчанию ~ iphone.png | iPhone 4 (не сетчатка) 640 x 960 Potrait
  • Default@2x~iphone.png | iPhone 4, 4s 640 x 960 Potrait
  • Default-568h@2x~iphone.png | iPhone 5, 5c, 5s 640 x 1136 Potrait
  • По умолчанию 375w-667h@2x~iphone.png | iPhone 6/7/8 750 x 1334 Potrait
  • По умолчанию 414w-736h@3x~iphone.png | iPhone 6 + / 7 + / 8 + 1242 x 2208 Potrait
  • Default-Landscape-414w-736h@3x~iphone.png | iPhone 6 + / 7 + / 8 + 2208 x 1242 Пейзаж
  • Default-Landscape-812h@3x~iphone.png | iPhone X 2436 x 1125 Пейзаж
  • По умолчанию 812h@3x~iphone.png | iPhone X 1125 x 2436 Портрет

После того, как вы сделали эти изображения (и назвали точно так, как показано), включите их в свой проект (они должны быть в root вашего приложения), выполнив следующие действия:

В FlashPro

  • перейдите к настройкам публикации
  • , перейдите к Настройки AIR для iOS.
  • Перейдите на вкладку «Общие»
  • , добавьте все эти изображения в список «включенные файлы» (корень)

SCALING YOUR CONTENT

  • ВАРИАНТ 1, ЗАПОЛНЕНИЕ И ПОДГОТОВКА

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

stage.scaleMode = StageScaleMode.NO_BORDER

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

Однако, если вы хотите разрешить изменения ориентации (портретный пейзаж) , обрезка, вероятно, будет слишком серьезной.

  • ВАРИАНТ 2 - РЕСПОНДИВНЫЙ ДИЗАЙН

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

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align     = StageAlign.TOP_LEFT;

Теперь ваши оценки сцены (stage.stageWidth & amp; stage.stageHeight) будут иметь полную ширину и высоту устройства *. (на некоторых устройствах есть панель инструментов внизу или верхняя полоса).

Затем вы можете позиционировать вещи через код.

Если вы хотите, чтобы простой способ конвертировать то, что у вас есть (вы не хотите использовать код для изменения размера и выравнивания абсолютно всех), просто поместите весь свой контент в контейнер MovieClip с именем экземпляра container, вы можете его размер и положение следующим образом:

//scale the container as big as possible while still fitting entirely in the screen:

//figure out which dimension should match the stage (widht or height)
if(container.width - stage.stageWidth >= container.height - stage.stageHeight){
    container.width = stage.stageWidth;
    container.scaleY = container.scaleX;
}else {
    container.height = stage.stageHeight
    container.scaleX = container.scaleY;
}

//center it on the screen:
container.x = (stage.stageWidth - container.width) * 0.5;
container.y = (stage.stageHeight - container.height) * 0.5;

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

Вы делаете это по прослушивание события изменения размера на сцене:

stage.addEventListener(Event.RESIZE, redrawScreen);

function redrawScreen(e:Event):void {
    //resize everything as the window size has changed.
}
2
задан Sir Wellington 13 October 2010 в 06:05
поделиться

5 ответов

Дикая догадка: ваш код предполагает машину большого конца (сначала самый старший байт). ПК с ОС Windows является малоподвижным. Поэтому, возможно, попробуйте

  shortValue = (shortArray[j+1]<<8);
  shortValue += (shortArray[j]);

. Если действительно проблема заключается в том, что проблема, то представленный вами код просто сбривает 4 наиболее значимых бита каждого значения и расширяет остальные до диапазона интенсивности. Hm, EDIT, спустя 2 секунды: нет, это было мозгом. Но попробовать все равно?

Cheers & amp; hth.,

- Alf

-1
ответ дан Cheers and hth. - Alf 18 August 2018 в 17:31
поделиться

Основная проблема, как я понимаю, состоит в том, чтобы преобразовать 12-битное значение в 8-разрядный.

Range of 12-bit value = 0 - 4095 (4096 values)
Range of  8-bit value = 0 -  255 ( 256 values)

Я бы попытался преобразовать 12-битное значение x в 8-битное значение y

  1. Сначала сначала уменьшите масштаб до диапазона 0-1 и
  2. Затем масштабируйте до диапазона 0-256.

Некоторые C-ish-коды:

uint16_t x = some_value; 
uint8_t  y = (uint8_t) ((double) x/4096 ) * 256;

Update

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

Затем я начал рассмотрение другого решения. Как насчет построения y с 8 наиболее значимыми битами x? Другими словами, обрезая младшие значащие биты 4.

y = x >> 4;

Будет ли это работать?

0
ответ дан Community 18 August 2018 в 17:31
поделиться
  • 1
    Я думаю, что вы близки или правы на деньги с этим. – Sir Wellington 13 October 2010 в 05:59
  • 2
    Исходный код уже делает что-то подобное более эффективно и не теряя больше точности, чем необходимо, округляя (но, возможно, с проблемой endianness?). Ваше предложение не имеет никакой пользы, за исключением того, что код в 10 раз медленнее или хуже, выполняя разделение с плавающей запятой. – kriss 13 October 2010 в 05:59
  • 3
    @Juan: Спасибо, но я не уверен, что это было поощрение или сарказм :-). @kriss: Спасибо, что указал на недостаток. Я разместил обновление, дайте мне знать, если у вас есть дополнительные комментарии. @ Анонимный избиратель: я пытаюсь учиться, пытаясь решить. Это будет полезно для меня, если вы предоставите свои комментарии, как @kriss. – Arun 13 October 2010 в 06:33
  • 4
    @ArunSaha: Никакого сарказма, я чувствовал, что ты что-то коснулся, когда сказал, чтобы увеличить значение до диапазона 0-1. Остальное было излишним, но ваше первое заявление пробило шнур. – Sir Wellington 13 October 2010 в 06:45
  • 5
    @Juan: Спасибо. Действительно ли мой (обновленный) ответ имеет смысл? – Arun 13 October 2010 в 06:56

, если вы просто хотите сбросить нижние 4 младших значащих бита, вы можете сделать следующее:

unsigned int start_value = SOMEVALUE; // starting value
value = (value & 0xFF0 );             // drop bits 
unsigned char final_value =(uint8_t)value >> 4; //bit shift to 8 bits

Обратите внимание на «unsigned». Вы не хотите, чтобы подписанный бит сбрасывался с вашими значениями.

0
ответ дан Jim 18 August 2018 в 17:31
поделиться

Нравится это:

// Image is stored in 'data'
unsigned short* I = (unsigned short*)data;

for(int i=0; i<imageSize; i++) {
// 'color' is the 8-bit value  
   char color = (char)((double)(255*I[i])/(double)(1<<12));
   /*...*/ 
}
0
ответ дан Pierre 18 August 2018 в 17:31
поделиться
2
ответ дан Sir Wellington 18 August 2018 в 17:31
поделиться