Почему Bitmap.createBitmap возвращает растровое изображение с размером, отличным от указанного, и как этого избежать?

Когда я создаю Bitmap и Canvas со следующим кодом:

Bitmap bitmap = Bitmap.createBitmap(640, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);

и я поставил точку останова во второй строке, чтобы отобразить превью, оказывается размер созданного Bitmap отличается от указанного. Он должен быть шириной 640px, но в превью написано, что вместо этого он 377px.

Высота уменьшается на тот же коэффициент (640/377 совпадает с 1737/1024), поэтому я предполагаю, что там происходит какое-то нежелательное масштабирование.

Интересно, что bitmap.getWidth() возвращает 640.

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

BitmapFactory.decodeResource(context.resources, R.drawable.image)

и я масштабирую их позже до нужной ширины:

Bitmap.createScaledBitmap(bitmap, desiredWidthPx, targetHeightToKeepAspectRatio, false)

предварительный просмотр отладчика показывает их правильно, т.е. их размер соответствует desiredWidthPx и targetHeightToKeepAspectRatio. Так что это не проблема предварительного просмотра.

Для контекста: я наткнулся на эту проблему, работая над Bitmap с определенной шириной в пикселях. Позже Bitmap будет напечатан на термопринтере, поэтому размер не должен зависеть от размера экрана Android-устройства, плотности и так далее. Я начал отлаживать эту проблему после того, как понял, что принтер печатает около 60% изображения (оно было обрезано по горизонтали), например. что-то вроде этого:

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вместо этого вы можете использовать BufferedImage: https://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html

Ответ принят как подходящий

Размер растрового изображения в предварительном просмотре отладки ограничен 1024 пикселями независимо от метода, использованного для его создания. Похожие вопрос и трекер задач. Ваша проблема с принтером не связана с ним.

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

Andrzej Zabost 19.02.2023 13:20

Другие вопросы по теме