Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序创建不完整的图像_Android_File_Bitmap_Fileoutputstream - Fatal编程技术网

Android应用程序创建不完整的图像

Android应用程序创建不完整的图像,android,file,bitmap,fileoutputstream,Android,File,Bitmap,Fileoutputstream,我正在开发一个结合了两个位图的应用程序,其中一个位图来自drawable,另一个来自相机快照。然而,这些图片最终总是不完整的。这幅画的一半是好的,但另一半是灰色的。在应用程序继续使用代码之前,是否有办法确保文件已完成?下面是编写和保存文件的代码。谢谢 Combine.java protected void createPostcard(byte[] data, File pictureFile, CameraActivity app, Button shareButton,

我正在开发一个结合了两个位图的应用程序,其中一个位图来自drawable,另一个来自相机快照。然而,这些图片最终总是不完整的。这幅画的一半是好的,但另一半是灰色的。在应用程序继续使用代码之前,是否有办法确保文件已完成?下面是编写和保存文件的代码。谢谢

Combine.java

protected void createPostcard(byte[] data, File pictureFile, CameraActivity app, Button shareButton,
                              Button newButton) {
    try {
        Bitmap photo    = BitmapFactory.decodeByteArray(data, 0, data.length);
        Bitmap splash   = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(app.getResources(), 
                                                    R.drawable.wishsplash), photo.getWidth(), photo.getHeight(), false);
        Bitmap postcard = Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), photo.getConfig());
        Canvas canvas   = new Canvas(postcard);

        canvas.drawBitmap(photo, new Matrix(), null);
        canvas.drawBitmap(splash, 0, 0, null);
        savePostcard(postcard, pictureFile, app, shareButton, newButton);
    } catch (Exception e) {
    }//end catch
}//end createPostcard

/**
 * Saves the postcard
 */
private void savePostcard(Bitmap postcard, File pictureFile, CameraActivity app, Button shareButton, 
                          Button newButton) {

        BitmapDrawable mBitmapDrawable = new BitmapDrawable(postcard);
        Bitmap mNewSaving              = mBitmapDrawable.getBitmap();
        ByteArrayOutputStream stream   = new ByteArrayOutputStream();

        mNewSaving.compress(CompressFormat.JPEG, 100, stream);
        byte[] byteArray = stream.toByteArray();
        save(byteArray, pictureFile, app);
        shareButton.setBackgroundResource(R.drawable.sharebutton);
        newButton.setBackgroundResource(R.drawable.newbutton);
        shareButton.setEnabled(true);
        newButton.setEnabled(true);
}//end savePostcard


/**
 * Check if external is available. If not, postcard will be saved in internal.
 * @retun
 */
private void save(byte[] data, File pictureFile, CameraActivity app) {
    try {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            FileOutputStream fos           = new FileOutputStream(pictureFile);
            imageUri                       = Uri.fromFile(pictureFile);
            fos.write(data);
            imageFile = pictureFile;
            fos.close();
            app.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                                         Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
        } else {
            File cache           = app.getCacheDir();
            File internalPic     = new File(cache, pictureFile.getName());
            FileOutputStream fos = new FileOutputStream(internalPic);
            imageUri             = Uri.fromFile(internalPic);
            imageFile            = internalPic;
            fos.write(data);
            fos.close();
        }//end else
    } catch (FileNotFoundException e) {
        System.out.println("FILENOTFOUND");
    } catch (IOException e) {
        System.out.println("IOEXCEPTION");
    }//end catch
}//end getStorage
试试这个代码

    public Bitmap PutoverBmp(Bitmap all, Bitmap scaledBorder) {
    Paint paint = new Paint();
    final int width = bmp.getWidth(); // bmp is your main Bitmap
    final int height = bmp.getHeight();
    patt = Bitmap.createScaledBitmap(bmp, width, height, true);
    Bitmap mutableBitmap = patt.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(mutableBitmap);
    scaledBorder = Bitmap.createScaledBitmap(border, width, height, true);
    paint.setAlpha(100);
    canvas.drawBitmap(scaledBorder, 0, 0, paint);
    return mutableBitmap;

}

只需将其称为
Bitmap combine=(bmp,yourOtherBitmap)

谢谢您的建议。但是现在我得到一个OutOfMemoryError,堆大小=49187KB,分配=42138KB,限制=49152KB。这似乎发生在以“patt”开头的行上。您必须首先对位图进行采样,否则它将导致内存不足。