2013-06-25 52 views
7

Xin chào!Android. Cách viết văn bản trên hình ảnh thực sự lớn (bitmap) và lưu rằng

Có vấn đề sau: Tôi cần viết một văn bản dài trên một hình ảnh khá lớn và lưu nó ở đó.

Điều kiện:

  1. kích thước hình ảnh hơn 3000 x 2000;
  2. Chia hình ảnh thành các phần không được phép vì văn bản được viết trên toàn bộ hình ảnh từ cạnh này sang cạnh khác.
  3. Đã thêm: Tôi không thể sử dụng thang tỷ lệ bitmap hoặc ma trận, vì nó là cần thiết để viết văn bản trên hình ảnh gốc (có kích thước đầy đủ).
  4. Added: Khi tôi thể hiện hình ảnh cho người sử dụng tôi sử dụng quy mô Bitmap: options.inSampleSize = 10; và không có vấn đề với thiếu bộ nhớ

Vấn đề hiện nay:

Khi tôi cố gắng tải hình ảnh này trong lỗi Bitmap xảy ra với giới hạn bộ nhớ (ngân sách VM).

Câu hỏi:

  1. Làm thế nào để văn bản trên một hình ảnh lớn mà không cần nạp nó vào bộ nhớ?
  2. Thư viện hiện có có thể sử dụng cho điều này không?

Mã dụ:

// Step 1. Open image and load to Bitmap 
Bitmap bitmap = BitmapFactory.decodeFile(fileName); // runtime Exception like "VM budget" ! 
// or 
//Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.big_img_1); // as in previous runtime Exception like "VM budget" ! 
// or 
//Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream); // as in previous runtime Exception like "VM budget" ! 


// Step 2. Write text 
Paint paint = new Paint(); 
paint.setColor(Color.BLACK); 
paint.setTextSize(14); 

Canvas canvas = new Canvas(bitmap); 
canvas.drawText("some long long string over all image", 100, 100, paint); 

// Step 3. Save bitmap to file 
OutputStream fOut = new FileOutputStream(new File(fileName)); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); 
fOut.flush(); 
fOut.close(); 
/* 
    _________________________________________________ 
    |            | 
    |            | 
    |            | 
    |            | 
    |      IMG      | 
    |            | 
    |            | 
    | some long long string over all image | 
    |________________________________________________| 
    */ 
+0

Những hình ảnh có phần minh bạch hay không? – Plato

+0

không sử dụng minh bạch – Andrei

+0

bất kỳ may mắn nào trên trang này? – Adrian

Trả lời

0

Thứ nhất sử dụng sự giúp đỡ sau để tải bitmap lớn

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

thứ hai để viết về hình ảnh và lưu, bạn có thể sử dụng vải

Tôi làm một cái gì đó như thế này trong một ứng dụng. Sử dụng Canvas.

Tôi đã chỉnh sửa một đoạn mã của tôi, thực tế cũng thêm một vài hình ảnh khác trên nền và nội dung.

Thịt mã:

private static Bitmap getPoster(...) { 
Bitmap background = BitmapFactory.decodeResource(res, background_id) 
    .copy(Bitmap.Config.ARGB_8888, true); 
Canvas canvas = new Canvas(background); 
Typeface font = Typeface.createFromAsset(res.getAssets(), FONT_PATH); 
font = Typeface.create(font, Typeface.BOLD); 
Paint paint = new Paint(); 
paint.setTypeface(font); 
paint.setAntiAlias(true); 
paint.setColor(Color.WHITE); 
paint.setStyle(Style.FILL); 
paint.setShadowLayer(2.0f, 1.0f, 1.0f, Color.BLACK); 
float fontSize = getFontSize(background.getWidth(), THE_QUOTE, paint); //You'll have to define a way to find a size that fits, or just use a constant size. 

paint.setTextSize(fontSize); 
canvas.drawText(THE_QUOTE, (background.getWidth() - paint.measureText(THE_QUOTE))/2, 
    background.getHeight() - FILLER_HEIGHT, paint); //You might want to do something different. In my case every image has a filler in the bottom which is 50px. 
return background; 
} 

Đặt phiên bản riêng của bạn về điều đó trong một lớp học và thức ăn nó id hình ảnh và bất cứ điều gì khác. Nó trả về một bitmap cho bạn để làm bất cứ điều gì bạn muốn với (hiển thị nó trong một lần xem ảnh, cho phép người dùng lưu nó và đặt làm wallpape).

+0

Trong dòng này 'Bitmap background = BitmapFactory.decodeResource (res, background_id) .copy (Bitmap.Config.ARGB_8888, true);' tôi nhận được ngoại lệ "ngân sách VM" trên hình ảnh hơn 3000 x 2000 – Andrei

+0

Vui lòng sử dụng kỹ thuật này ở đây - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html hoặc bạn có thể sử dụng lớp Ma trận để giảm kích thước của hình ảnh – blganesh101

+0

Tôi không thể sử dụng thang tỷ lệ bitmap hoặc ma trận, như nó là cần thiết để viết văn bản trên hình ảnh ban đầu (trong kích thước đầy đủ) – Andrei

1

Đây không phải là chính xác những gì bạn đang tìm kiếm nhưng nó có thể hữu ích.

Nếu hình ảnh của bạn là không minh bạch bạn có thể giảm dung lượng bộ nhớ bạn cần phải tải nó bằng cách xác định RGB_565 cho nó cấu hình như thế này:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.RGB_565; 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image, options); 
+0

Mã đầy đủ 'BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inPurgeable = true; options.inInputShareable = true; options.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bm = BitmapFactory.decodeFile (tệpPath, tùy chọn); 'Và tôi vẫn nhận được ngoại lệ" java.lang.OutOfMemoryError: kích thước bitmap vượt quá ngân sách VM " – Andrei

Các vấn đề liên quan