Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7603159
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 30, 20262026-05-30T23:35:53+00:00 2026-05-30T23:35:53+00:00

In the process of tracking severe memory issues in my app, I looked at

  • 0

In the process of tracking severe memory issues in my app, I looked at several heap dumps from my app, and most of the time I have a HUGE bitmap that I don’t know of.

It takes 9.4MB, or 9,830,400 bytes, or actually a 1280×1920 image at 4 bytes per pixels.

I checked in Eclipse MAT, it is indeed a byte[9830400], that has one incoming reference which is a android.graphics.Bitmap.

I’d like to dump this to a file and try to see it. I can’t understand where is it coming from. My biggest image in all my drawables is a 640×960 png, which takes less than 3MB.

I tried to use Eclipse to “copy value to file”, but I think it simply prints the buffer to the file, and I don’t know any image software that can read a stream of bytes and display it as a 4 bytes per pixel image.

Any idea?

Here’s what I tried: dump the byte array to a file, push it to /sdcard/img, and load an activity like this:

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        final File inputFile = new File("/sdcard/img");
        final FileInputStream isr = new FileInputStream(inputFile);
        final Bitmap bmp = BitmapFactory.decodeStream(isr);
        ImageView iv = new ImageView(this);
        iv.setImageBitmap(bmp);
        setContentView(iv);
        Log.d("ImageTest", "Image was inflated");
    } catch (final FileNotFoundException e) {
        Log.d("ImageTest", "Image was not inflated");
    }
}

I didn’t see anything.

Do you know how is encoded the image? Say it is stored into byte[] buffer. buffer[0] is red, buffer[1] is green, etc?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-30T23:35:54+00:00Added an answer on May 30, 2026 at 11:35 pm

    OK — After quite some unsuccessful tries, I finally got something out of this byte array. I wrote this simple C program to convert the byte array to a Windows Bitmap file. I’m dropping the code in case somebody is interested.
    I compiled this against VisualC 6.0 and gcc 3.4.4, it should work on any OS (tested on Windows, Linux and MacOS X).

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    
    /* Types */
    typedef unsigned char byte;
    typedef unsigned short uint16_t;
    typedef unsigned int uint32_t;
    typedef int int32_t;
    
    /* Constants */
    #define RMASK 0x00ff0000
    #define GMASK 0x0000ff00
    #define BMASK 0x000000ff
    #define AMASK 0xff000000
    
    /* Structures */
    struct bmpfile_magic {
      unsigned char magic[2];
    };
    
    struct bmpfile_header {
      uint32_t filesz;
      uint16_t creator1;
      uint16_t creator2;
      uint32_t bmp_offset;
    };
    
    struct bmpfile_dibheader {
      uint32_t header_sz;
      uint32_t width;
      uint32_t height;
      uint16_t nplanes;
      uint16_t bitspp;
      uint32_t compress_type;
      uint32_t bmp_bytesz;
      int32_t hres;
      int32_t vres;
      uint32_t ncolors;
      uint32_t nimpcolors;
    
      uint32_t rmask, gmask, bmask, amask;
      uint32_t colorspace_type;
      byte colorspace[0x24];
      uint32_t rgamma, ggamma, bgamma;
    };
    
    /* Displays usage info and exits */
    void usage(char *cmd) {
        printf("Usage:\t%s <img_src> <img_dest.bmp> <width> <height>\n"
            "\timg_src:\timage byte buffer obtained from Eclipse MAT, using 'copy > save value to file' while selecting the byte[] buffer corresponding to an android.graphics.Bitmap\n"
            "\timg_dest:\tpath to target *.bmp file\n"
            "\twidth:\t\tpicture width, obtained in Eclipse MAT, selecting the android.graphics.Bitmap object and seeing the object member values\n"
            "\theight:\t\tpicture height\n\n", cmd);
        exit(1);
    }
    
    /* C entry point */
    int main(int argc, char **argv) {
        FILE *in, *out;
        char *file_in, *file_out;
        int w, h, W, H;
        byte r, g, b, a, *image;
        struct bmpfile_magic magic;
        struct bmpfile_header header;
        struct bmpfile_dibheader dibheader;
    
        /* Parse command line */
        if (argc < 5) {
            usage(argv[0]);
        }
        file_in = argv[1];
        file_out = argv[2];
        W = atoi(argv[3]);
        H = atoi(argv[4]);
        in = fopen(file_in, "rb");
        out = fopen(file_out, "wb");
    
        /* Check parameters */
        if (in == NULL || out == NULL || W == 0 || H == 0) {
            usage(argv[0]);
        }
    
        /* Init BMP headers */
        magic.magic[0] = 'B';
        magic.magic[1] = 'M';
    
        header.filesz = W * H * 4 + sizeof(magic) + sizeof(header) + sizeof(dibheader);
        header.creator1 = 0;
        header.creator2 = 0;
        header.bmp_offset = sizeof(magic) + sizeof(header) + sizeof(dibheader);
    
        dibheader.header_sz = sizeof(dibheader);
        dibheader.width = W;
        dibheader.height = H;
        dibheader.nplanes = 1;
        dibheader.bitspp = 32;
        dibheader.compress_type = 3;
        dibheader.bmp_bytesz = W * H * 4;
        dibheader.hres = 2835;
        dibheader.vres = 2835;
        dibheader.ncolors = 0;
        dibheader.nimpcolors = 0;
        dibheader.rmask = RMASK;
        dibheader.gmask = BMASK;
        dibheader.bmask = GMASK;
        dibheader.amask = AMASK;
        dibheader.colorspace_type = 0x57696e20;
        memset(&dibheader.colorspace, 0, sizeof(dibheader.colorspace));
        dibheader.rgamma = dibheader.bgamma = dibheader.ggamma = 0;
    
        /* Read picture data */
        image = (byte*) malloc(4*W*H);
        if (image == NULL) {
            printf("Could not allocate a %d-byte buffer.\n", 4*W*H);
            exit(1);
        }
        fread(image, 4*W*H, sizeof(byte), in);
        fclose(in);
    
        /* Write header */
        fwrite(&magic, sizeof(magic), 1, out);
        fwrite(&header, sizeof(header), 1, out);
        fwrite(&dibheader, sizeof(dibheader), 1, out);
    
        /* Convert the byte array to BMP format */
        for (h = H-1; h >= 0; h--) {
            for (w = 0; w < W; w++) {
                r = *(image + w*4 + 4 * W * h);
                b = *(image + w*4 + 4 * W * h + 1);
                g = *(image + w*4 + 4 * W * h + 2);
                a = *(image + w*4 + 4 * W * h + 3);
    
                fwrite(&b, 1, 1, out);
                fwrite(&g, 1, 1, out);
                fwrite(&r, 1, 1, out);
                fwrite(&a, 1, 1, out);
            }
        }
    
        free(image);
        fclose(out);
    }
    

    So using this tool I was able to recognise the picture used to generate this 1280×1920 bitmap.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

We are in the process of migrating an app to .NET 4.0 (from 3.5).
Currently we have several defect and bug tracking systems, which include Quality Centre and
We are in the process of migrating our bug tracking to Bugzilla from a
I'm at the part of my development process for tracking down crashing and memory
I'm currently in the process of programming an utility which generates GA tracking pixel
I have been tracing a process with strace and have seen entries such as:
Current Process: I have a tar.gz file. (Actually, I have about 2000 of them,
I'm implementing click tracking from various pages in our corporate intranet in order to
I have a problem where I can get tracking to work fine, however I
We have a database that is updated via a background process. We are using

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.