Android将视图保存为jpg或png

Posted

技术标签:

【中文标题】Android将视图保存为jpg或png【英文标题】:Android save view to jpg or png 【发布时间】:2011-03-07 15:46:36 【问题描述】:

我想编写一个 android 应用程序,它基本上在另一个图像上叠加一个图像,然后我想将带有叠加层的图片保存为 jpg 或 png。基本上这将是我想要保存的整个视图。

示例代码会很有帮助。

编辑:

我尝试了您的建议,并在星号线处得到一个空指针。

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Bundle;
import android.os.Environment;
import android.widget.LinearLayout;
import android.widget.TextView;

    public class EditPhoto extends Activity 
        /** Called when the activity is first created. */
     LinearLayout ll = null;
     TextView tv = null;
        @Override
        public void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            tv = (TextView) findViewById(R.id.text);
            ll = (LinearLayout) findViewById(R.id.layout);
            ll.setDrawingCacheEnabled(true);
            Bitmap b = ll.getDrawingCache();
            File sdCard = Environment.getExternalStorageDirectory();
            File file = new File(sdCard, "image.jpg");
            FileOutputStream fos;
      try 
       fos = new FileOutputStream(file);
       *** b.compress(CompressFormat.JPEG, 95,fos);
       catch (FileNotFoundException e) 
       // TODO Auto-generated catch block
       e.printStackTrace();
      

        
    

【问题讨论】:

这没什么?我知道这是可能的,我已经在其他应用程序中看到过。 你能给我们一些代码来描述你是如何进行编辑的吗? 现在更多的是一个想法,但我只会在照片图像视图上覆盖一个图像视图。除非有更好的方法。 您是要保存带有图层的图像(ala PSD)还是仅保存为平面图像(ala png)? 一个平面 png 或 jpg 就可以了。 【参考方案1】:

您可以利用视图的绘图缓存。

view.setDrawingCacheEnabled(true);
Bitmap b = view.getDrawingCache();
b.compress(CompressFormat.JPEG, 95, new FileOutputStream("/some/location/image.jpg"));

视图是您的视图。 95是JPG压缩的质量。而文件输出流就是这样。

【讨论】:

我试过你的代码,但是 FileOutputStream 的根从哪里开始?因为我试图查看模拟器的文件夹并找不到保存的图像... 它从手​​机根目录开始。因此,如果您想从 sdcard 加载某些内容,请使用 Environment.getExternalStorageDirectory() 获取 sdcard 的根目录。 那么在这种情况下,LinerLayout 可以成为视图吗?这会抓住 LinearLayout 中的任何东西吗? 它看起来很有效,谢谢你,我几乎所有的代表都走了:)。谢谢大家!! 我解决了我的问题。见my solution here【参考方案2】:
File sdCard = Environment.getExternalStorageDirectory();
File file = new File(sdCard, "image.jpg");
FileOutputStream fos = new FileOutputStream(file);

在 Moncader 的回答中使用 fos 引用作为 b.compress() 方法的第三个参数。图片会以 image.jpg 格式保存在你的 sd 卡根目录下。

【讨论】:

【参考方案3】:

将 RelativeLayout 或任何视图保存到图像 (.jpg)

String getSaveImageFilePath() 
    File mediaStorageDir = new File(
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), YOUR_FOLDER_NAME);
    // Create a storage directory if it does not exist
    if (!mediaStorageDir.exists()) 
        if (!mediaStorageDir.mkdirs()) 
            Log.d(YOUR_FOLDER_NAME, "Failed to create directory");
        
    

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageName = "IMG_" + timeStamp + ".jpg";

    String selectedOutputPath = mediaStorageDir.getPath() + File.separator + imageName;
    Log.d(YOUR_FOLDER_NAME, "selected camera path " + selectedOutputPath);

    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());

    int maxSize = 1080;

    int bWidth = bitmap.getWidth();
    int bHeight = bitmap.getHeight();

    if (bWidth > bHeight) 
        int imageHeight = (int) Math.abs(maxSize * ((float)bitmap.getWidth() / (float) bitmap.getHeight()));
        bitmap = Bitmap.createScaledBitmap(bitmap, maxSize, imageHeight, true);
     else 
        int imageWidth = (int) Math.abs(maxSize * ((float)bitmap.getWidth() / (float) bitmap.getHeight()));
        bitmap = Bitmap.createScaledBitmap(bitmap, imageWidth, maxSize, true);
    
    view.setDrawingCacheEnabled(false);
    view.destroyDrawingCache();

    OutputStream fOut = null;
    try 
        File file = new File(selectedOutputPath);
        fOut = new FileOutputStream(file);

        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
        fOut.flush();
        fOut.close();
     catch (Exception e) 
        e.printStackTrace();
    
    return selectedOutputPath;

【讨论】:

以上是关于Android将视图保存为jpg或png的主要内容,如果未能解决你的问题,请参考以下文章

在android设备文件夹中将字节数组保存为jpg文件

如何将图形保存为png或jpg文件c#

将 NSImageView 以 png/jpg 格式保存到磁盘

MS Access 将剪贴板中的图片保存为 jpg

如何使用 as3 将 jpg 图像保存到 Android 手机

Android byte数组保存为jpg图片