0

In my program (Cordova) I use Contact photos. To avoid additional operation like store them in external storage I decided to convert image to Base64 image and save them as String Json in SharePrefrences.

Here is example what I get from image 124x124 length 7231 chars:

data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYF\nBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoK\nCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCABgAGADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzPX/D\nWlX1h/Z+pWH2jz7fyun9+q/h/wAD6D4QsbfRtE0D7Nbf88Lb5P3tegR+A7nUiR/z3/8AINZ3hH9n\nrxpYa2b/AP4WXq17bf8APhdWsPl/+Oiv4Twea4f6pUhWxXJ5H9Vzwvv/AAHOxaG3IIrSt9DIBzp9\ne0eFP2X9e1//AJh9dzP+yXpXg/wre+N/iBqNtpOk6RYSXWq6vdXKR29tCmf3rs/CCvFp8QYevXhQ\nh785/CXXpU8HT/fHyzqkegaBYXOs6l4j022023/4+Li6uf8AU/7/APcryvx1+2l+zx8P7C51DTfG\nOnav5H+v/sa5SST/AK6/e/4DXxl/wUI/a3X43/FnVtO+G2v3P/CLW9xJFY+XbfZ/t8W//Wzbceb/\n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\n

However if user has about 600 contacts this approach leads me to java.lang.OutOfMemoryError on strig manipulations like: StringBuilder.toString() or JOSNArray.toString() and so on.

Is this any way to make base64 String shorter?

I tried to reduce image width / height but I lose image quality here.

Any suggestions?

snaggs
  • 5,543
  • 17
  • 64
  • 127

1 Answers1

1

Simple answer: No not when only using base64.

But you can:

Community
  • 1
  • 1
Rolf ツ
  • 8,611
  • 6
  • 47
  • 72
  • gzip output is File and I can't handle files in my case. In old versions I stored iamges as `png` in external storage but when user opens application, it takes time to load all images. For that reason I decided to use base64.Thanks, – snaggs Oct 30 '14 at 10:44
  • You could use gzip to compress the image to a byte stream and than convert the byte stream to base64. gzip is just a compression algorithm and is not only used for files. – Rolf ツ Oct 30 '14 at 10:54
  • But why don't u use a sql database for storing the images? The base64 method you're using now seems overkill to me. – Rolf ツ Oct 30 '14 at 10:55
  • I thought to use it, but load images from Shareprefrences takes less time then from SQLite. – snaggs Oct 30 '14 at 12:09
  • I don't think you should care about the load time it's a very very minimal difference. I would at least go for the SQL option. But why don't you save the images to a special directory called for example "contact images" and make the directory private to your app. Then save the contact images to that directory and name the files with the contact id or something like that. – Rolf ツ Oct 30 '14 at 12:25
  • 1
    it takes me 3-4 seconds to load them from folder to JavaScript (GUI). With Sharepreferences - 1-2 sec but on weak devices I get Exception. Im trying for now to use SQLite. – snaggs Oct 30 '14 at 13:43
  • Remeber: dont load all images at once, only the images currently visible in you listview and app. On most devices apps get very little memory to work with, most of the time between 16mb and 32mb – Rolf ツ Oct 30 '14 at 20:51