2016-08-18 149 views
1

我想並排保存2位圖到有效的圖像文件。Android - 將2位圖保存爲僅一個圖像文件

我可以保存位圖位圖中的所有字節,並且圖像文件是一個有效的圖像字節,我可以打開並查看該圖像,但只是第一個位圖顯示在圖像中!

我嘗試這樣做:

void save_bitmaps() 
{ 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    String root = Environment.getExternalStorageDirectory().toString(); 
    File myDir = new File(root + "/req_images"); 
    myDir.mkdirs(); 
    String fname = "Map"+ String.valueOf(10) + ".png"; 
    File file = new File(myDir, fname); 
    for(int i=0;i<2;i++) 
    { 
     int count=0; 
     //------------------------------------------ 
     Bitmap bitmap = Bitmap.createBitmap(500,500,Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(bitmap); 
     if(i==0) 
      c.drawColor(Color.BLUE); 
     if(i==1) 
      c.drawColor(Color.RED); 

     bitmap.compress(Bitmap.CompressFormat.PNG,100,stream); 
     byte[] bytarray = stream.toByteArray(); 
     //---------------------------------------------------------------- 
     if (file.exists()) 
      file.delete(); 
     try { 
      FileOutputStream out = new FileOutputStream(file); 
      out.write(bytarray,count,bytarray.length); 
      out.flush(); 
      out.close(); 
      count+=bytarray.length; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Toast.makeText(getContext() , "ERROR" , Toast.LENGTH_SHORT).show(); 
     } 

    } 
    Toast.makeText(getContext() ,"Saved" , Toast.LENGTH_SHORT).show(); 
} 

這段代碼的工作,但沒有表現出他們兩個!

這是我的目標:

Target_Image_File

我怎麼能做到這一點。請幫助,如果你知道我可以做到這一點!

NOTE: 1.我從來不想將2位圖組合成另一個位圖並保存目標位圖。

  1. 如果您知道另一種方法將2位圖保存爲僅一個圖像文件而不使用字節數組,請對我說!

謝謝大家!

+0

'想要將2位圖並排保存到有效的圖像文件中。你終於展示了一些代碼。但是你忘了告訴你的代碼現在做什麼。 – greenapps

+0

一個有效的png文件只能保存一張圖片。所以你要求不可能。 GIF和TIFF可以容納更多。如果你想要一個PNG文件是兩個位圖的結果,那麼你必須首先將這些bjtmaps結合到一個位圖。 – greenapps

+0

奇怪的是,這是你的第三個同樣的問題。在前兩個你只想寫兩個位圖到同一個文件。這將是非常簡單的。但它不會是一個有效的圖像文件。 「有效」對我來說是新的。你之前可能已經提到過。 – greenapps

回答

0

如果你願意,你可以使用這個庫我做了,可以通過JNI處理大量的圖像文件:

https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations

但是,它不具有此功能,您希望。你必須自己添加它:

  1. 創建函數/ s用於存儲從Java世界到JNI世界的位圖。
  2. 創建合併圖像並獲取結果的功能。

您甚至可以同時只有一個Java Bitmap對象,而不是上面的Java解決方案(輸入的2個輸出+1)中的3個。

一些注意事項:

  1. 使用JNI可以慢,因爲它需要從Java位圖對象轉換爲JNI和背部。這對於大型位圖尤其如此。

  2. 最後,您仍然需要保存輸出Java Bitmap對象。如果是10000x10000像素,則需要10000 * 10000 * 4個字節,即400,000,000字節,大約400MB。如果輸入圖像不具有透明度,則可以使用不同的位圖配置(RGB_565),這需要大約200MB的RAM。

    在這兩種情況下,這是很多。您可以在清單中添加一個標誌來告訴操作系統您需要大量堆內存(largeHeap),但它不是一種安全的方式來獲取它,因爲您仍然可能得不到足夠的堆內存。在嘗試創建輸出位圖之前,您應該檢查可用堆內存的數量。

  3. 解決此問題的另一種方法是避免顯示整個位圖,因爲在Android設備上沒有屏幕具有此分辨率。你可以在屏幕上顯示一部分位圖,並計算你可以在JNI中留下的東西。

  4. 如果我的庫不夠用,還有其他庫使用JNI。我確信其中一人可以提供幫助。

+0

TNX爲此,我知道你可以幫助我。但我需要更多的幫助。你能否讓我以更好的方式與你溝通。像什麼應用程序或您認爲的其他東西。它對我很重要。請如果你能幫我更多的回答我。 tnX –

+0

它可能將位圖添加到以前存在的圖像文件中,而不會丟失當前圖像的字節並將它們並排顯示? –

+0

我不明白這個問題。你想合併2個圖像爲一個。你是什​​麼意思「添加位圖」?添加哪裏?如何?你是什​​麼意思「不丟失字節」?這取決於你如何壓縮它(JPEG將失去質量,但PNG和WEBP不會)。 –

0

使用以下代碼您可以添加圖像並將它們並排保存。 這對我有用。 所有最好的,希望你得到你的解決方案正確。

我加入保存文件功能裏面結合圖像本身。您可以根據自己需要實現的邏輯來更改它,因爲組合圖像將是該函數的輸出。

public Bitmap combineImages(Bitmap c, Bitmap s) { 
Bitmap cs = null; 

int width, height = 0; 

if(c.getWidth() > s.getWidth()) { 
    width = c.getWidth() + s.getWidth(); 
    height = c.getHeight(); 
} else { 
    width = s.getWidth() + s.getWidth(); 
    height = c.getHeight(); 
} 

cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

Canvas comboImage = new Canvas(cs); 

comboImage.drawBitmap(c, 0f, 0f, null); 
comboImage.drawBitmap(s, c.getWidth(), 0f, null); 

String tmpImg = String.valueOf(System.currentTimeMillis()) + ".png"; 
String loc="IMAGE Combined-"; 
OutputStream os = null; 
try { 
    os = new FileOutputStream(loc + tmpImg); 
    cs.compress(CompressFormat.PNG, 100, os); 
} catch(IOException e) { 
    Log.e("combineImages", "problem combining images", e); 
}*/ 

return cs; 
} 
+0

如果不是新的,你還想保存圖像嗎? – Athul

+0

請讓我知道你的最終任務的要求與組合圖像 – Athul

+0

請正確讀我的問題然後回答。它不能幫助我! –

相關問題