Как сбросить к идентификационным данным “текущую матрицу преобразования” с некоторой функцией CGContext?

Я подумал, что, возможно, вы могли бы преобразовать байты в их двоичное представление, а затем объединить 3 из них, чтобы получить 3 байта для диапазона 16 777 216, но эта теория неверна из того, что я могу сказать.

blockquote>

Не уверен, почему это не сработало для вас.

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

private static int byteToIntLittleEndian(final byte[] buf, final int offset, final int bytesPerSample) {
    int sample = 0;
    for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) {
        final int aByte = buf[offset + byteIndex] & 0xff;
        sample += aByte << 8 * (byteIndex);
    }
    return sample;
}

private static int byteToIntBigEndian(final byte[] buf, final int offset, final int bytesPerSample) {
    int sample = 0;
    for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) {
        final int aByte = buf[offset + byteIndex] & 0xff;
        sample += aByte << (8 * (bytesPerSample - byteIndex - 1));
    }
    return sample;
}

Как только значение будет декодировано Вы все еще должны привести к вашему целевому интервалу. Если вы заинтересованы в 2-байтовом формате, то есть глубине 16 бит, вы просто сделаете это:

final int sample = byteToIntLittleEndian(buf, sampleOffset, bytesPerChannel);
final short shortSample = (short)sample;

Приведение заботится о переполнении.

1113 С 3 байтами все немного сложнее. Вы должны знать диапазон значений в первую очередь. Обратите внимание, что поскольку вы заинтересованы в знаковых значениях, это не [0,2^24], а:

/**
 * A constant holding the minimum value a signed24bit can
 * have, -222.
 */
private static final int MIN_VALUE_24BIT = -2 << 22;

/**
 * A constant holding the maximum value a signed24bit can
 * have, 222-1.
 */
private static final int MAX_VALUE_24BIT = -MIN_VALUE_24BIT-1;

Затем вы используете это для преобразования в знаковое значение образца, например:

final int sample = byteToIntLittleEndian(bud, sampleOffset, bytesPerChannel);
final int threeByteSample = sample > MAX_VALUE_24BIT ? sample + MIN_VALUE_24BIT + MIN_VALUE_24BIT : sample;
7
задан Ariel Malka 22 January 2009 в 16:23
поделиться

1 ответ

Получите текущую матрицу преобразования через CGContextGetCTM, инвертируйте его с CGAffineTransformInvert и умножьте текущую матрицу на инвертированную (это важно!) с CGContextConcatCTM. CTM является теперь идентификационными данными.

15
ответ дан 6 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: