Android: Canvas дает мусор при смещении растрового изображения?

1

Я хотел бы использовать Canvas для "переноса растрового изображения"; для создания растрового изображения из растрового изображения, но с у-смещением, так что все пиксели в битовой карте либо сдвинуты вниз (с пустыми пикселями вверху), либо сдвинуты вверх (с пустыми пикселями внизу). Для этого я использую приведенный ниже код. Код работает нормально, пока я перехожу (shiftY отрицательный), но он дает растровое изображение мусора, если я пытаюсь сдвинуться вниз.

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

Есть ли способ переместить битмап без использования второго растрового изображения?

//create canvas from the current Bitmap.
Canvas canvas = new Canvas (m_Bitmap);
/*draw into the current Bitmap into the canvas with an offset, thereby drawing over itself 
shifted pixels*/
canvas.drawBitmap(m_Bitmap, 0, shiftY, null); 

`

//create the canvas from a temp bitmap
Canvas canvas = new Canvas (m_2ndBitmap);
//draw the shifted pixels into the temp bitmap
canvas.drawBitmap(m_BackBuffer, shiftX, shiftY, null);

//swap the bitmaps  
Bitmap temp = m_Bitmap;
m_Bitmap = m_2ndBitmap;
m_2ndBitmap = temp;
Теги:
bitmap
image-manipulation

3 ответа

0
Лучший ответ

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

  • 0
    ручное чтение и запись данных пикселей имеет очень значительное влияние на производительность; Я надеялся на безопасный способ использования Canvas, который работает намного лучше (вероятно, потому что он делает это изначально и т. Д.). Вероятно, это существует, потому что в java Graphics2D.drawImage (BufferedImage ...) является безопасным для направления.
  • 0
    Это известная проблема: code.google.com/p/android/issues/detail?id=3205
Показать ещё 3 комментария
0

Try:

canvas.drawBitmap(Bitmap.createBitmap(m_BackBuffer), shiftX, shiftY, null);

вместо:

canvas.drawBitmap(m_BackBuffer, shiftX, shiftY, null);
0

Когда вы ссылаетесь на "новый" или новый Bitmap на уже существующий Bitmap, уже существующий Bitmap будет доступен для сбора мусора.

Однако не создавать объекты во время выполнения: просто используйте два Bitmap, которые вы выделяете спереди, когда ваш Canvas был создан и пропустите создание нового Canvas.

  • 0
    Я смущен вашим ответом. Как показано в моем вопросе, я понимаю, как решить эту проблему с помощью двух растровых изображений. Однако для двух растровых изображений требуется вдвое больше памяти, и, похоже, одного растрового изображения должно быть достаточно, если команда рисования не оказалась неожиданной для положительных значений shiftY. Следовательно, мой запрос относительно того, есть ли возможность использовать только одно растровое изображение.
  • 0
    @ ab11: Хорошо, если вы пытаетесь использовать два Bitmap в одном приложении, вы должны выделить их оба заранее. Поскольку вы создаете новый Canvas из своего временного Bitmap , это снизит производительность вашего приложения, если этот Canvas canvas = new Canvas(...) произойдет во время выполнения.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню