У меня возникли трудности с размещением содержимого Canvas в Bitmap. Когда я пытаюсь это сделать, файл записывается с размером файла около 5,80 КБ, но он кажется совершенно пустым (каждый пиксель «# 000»).
Холст рисует ряд взаимосвязанных линий, образованных почерком. Ниже мой onDraw для просмотра. (Я знаю, что он блокирует поток пользовательских интерфейсов / неправильные методы / и т. Д., Однако мне просто нужно заставить его работать)
Спасибо.
@Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); if (IsTouchDown) { // Calculate the points Path currentPath = new Path(); boolean IsFirst = true; for(Point point : currentPoints){ if(IsFirst){ IsFirst = false; currentPath.moveTo(point.x, point.y); } else { currentPath.lineTo(point.x, point.y); } } // Draw the path of points canvas.drawPath(currentPath, pen); // Attempt to make the bitmap and write it to a file. Bitmap toDisk = null; try { // TODO: Get the size of the canvas, replace the 640, 480 toDisk = Bitmap.createBitmap(640,480,Bitmap.Config.ARGB_8888); canvas.setBitmap(toDisk); toDisk.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File("arun.jpg"))); } catch (Exception ex) { } } else { // Clear the points currentPoints.clear(); } }
У меня была аналогичная проблема, и у меня есть решение. Здесь полный код задачи / не забывайте про разрешение android.permission.WRITE_EXTERNAL_STORAGE
в манифесте /
public Bitmap saveSignature(){ Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); this.draw(canvas); File file = new File(Environment.getExternalStorageDirectory() + "/sign.png"); try { bitmap.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(file)); } catch (Exception e) { e.printStackTrace(); } return bitmap; }
Вам придется рисовать после установки растрового изображения на холст. Также используйте новый объект Canvas, например:
Canvas canvas = new Canvas(toDisk); canvas.drawPath(currentPath, pen); toDisk.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(new File("arun.png")));
Я рекомендую использовать PNG для сохранения изображений путей.
Сначала создайте пустое растровое изображение, затем создайте холст с этим пустым растровым изображением
Bitmap.Config conf = Bitmap.Config.ARGB_8888; Bitmap bitmap_object = Bitmap.createBitmap(width, height, conf); Canvas canvas = new Canvas(bitmap_object);
Теперь нарисуйте свои линии на холсте
Path currentPath = new Path(); boolean IsFirst = true; for(Point point : currentPoints){ if(IsFirst){ IsFirst = false; currentPath.moveTo(point.x, point.y); } else { currentPath.lineTo(point.x, point.y); } } // Draw the path of points canvas.drawPath(currentPath, pen);
Теперь получите доступ к вашему растровому изображению через bitmap_object
Вы должны вызвать canvas.setBitmap(bitmap);
Прежде чем рисовать что-либо на холсте. После вызова canvas.setBitmap(bitmap);
Нарисуйте Canvas
а затем сохраните Bitmap
вы передали Canvas
.
Может быть
canvas.setBitmap(toDisk);
Не в правильном месте.
Попробуй это :
toDisk = Bitmap.createBitmap(640,480,Bitmap.Config.ARGB_8888); toDisk.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File("arun.jpg"))); canvas.setBitmap(toDisk);