Я хотел бы использовать 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;
Вы можете сделать это самостоятельно, если скопировать строку за строкой снизу. Проблема в том, что ваш источник и место назначения одинаковы, и он копирует сверху, уничтожая строки внизу, прежде чем их можно скопировать ниже.
Try:
canvas.drawBitmap(Bitmap.createBitmap(m_BackBuffer), shiftX, shiftY, null);
вместо:
canvas.drawBitmap(m_BackBuffer, shiftX, shiftY, null);
Когда вы ссылаетесь на "новый" или новый Bitmap
на уже существующий Bitmap
, уже существующий Bitmap
будет доступен для сбора мусора.
Однако не создавать объекты во время выполнения: просто используйте два Bitmap
, которые вы выделяете спереди, когда ваш Canvas
был создан и пропустите создание нового Canvas
.
Bitmap
в одном приложении, вы должны выделить их оба заранее. Поскольку вы создаете новый Canvas
из своего временного Bitmap
, это снизит производительность вашего приложения, если этот Canvas canvas = new Canvas(...)
произойдет во время выполнения.