how to encode dart image object with base64 - flutter

I want to encode an Image object (not from a file) with base64
Eg: this code Image img = Image.memory(base64Decode(decoded(image))); shows how to convert base64 string to Image Object, then how can i reverse this operation ?

Image is a widget, so can't really convert it to base64 string;
Could do it with file:
import 'dart:convert';
import 'dart:io';
....
String base64String = base64Encode(file.readAsBytesSync());

You can use
var image = BASE64.decode(img.toString());
Image.memory(image)

Related

Flutter how to display an image from base64

I am using an API that brings data like this:
"photos": [
{
"id": 6,
"name": "Seguridad",
"base64Image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...",
}
]
What I need to do is to display the photos in a screen in my App. I've searched how to do it but I kept having the same error message: Exception: Invalid Image Data. I've read that what I need to do is to encode my base64 String, then decode that and then use it on Image.Memory, like this:
String image = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...';
var bs64 = base64.encode(utf8.encode(example));
Uint8List decodedImage = base64.decode(bs64);
// --------
Image.memory(decodedImage)
I've tried using different base64 strings but the error is always there. I appreciate any help with this.
Because you are not decoding base64 string.
You have to remove data:image/jpeg;base64, (comma included)
you have to remove that because that data:image/jpeg;base64, just indicates that the string is image data with jpeg format which is encoded as base64 string.
So, the actual base64 data starts after it and you have to decode that.

Decoding base64 string to image in flutter (Invalid character exception)

Basically I'm trying to convert a base64 jpeg image to normal image in flutter using
Image.memory(base64Decode(stringBase64))
the image initially used to be jp/2 format which isn't supported by flutter so i converted the jp/2 base64 string to bitmap in java and then to base64 string jpeg to be able to decode it in flutter using this code :
public static String encodeToBase64(Bitmap image)
{
Bitmap immagex=image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
return imageEncoded;
}
how ever when i try to decode this base64 string in flutter i'm getting this error
Invalid character (at character 77)
/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAIQAABtbnRyUkdC
which is pointing to the last C in the given line.
i don't seem understand where does the issue come from since i can convert my base64 string to image online but in flutter it throws that exception every time
thank you very much #Jamesdlin for the solution that was given in the comments
The issue was due to whitespace in the base64 string , solved by using
base64.decode(photoBase64.replaceAll(RegExp(r'\s'), '')),
If your URI contains data after the comma as it is defined by RFC-2397. Dart's Uri class is based on RFC-3986, so you can't use it.
Split the string by a comma and take the last part of it:
String uri = 'data:image/gif;base64,...';
Uint8List _bytes = base64.decode(uri.split(',').last);
REFERENCE: https://stackoverflow.com/a/59015116/12382178

How to decode or convert base64 string url to UintList in Dart?

I got this base64Result from canvas.toDataURL() but I having difficulties parsing in Dart to 'UintList'
import 'dart:convert';
final String base64Result = result.toString();
print("$logTrace calling web function done ${base64Result.length}");
final bytes = base64Url.decode(base64Result);
character (at character 5)
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARwAAAIrCAYAAAA9YyZoAAAgAElEQ...
^
'data:image/png;base64,' is part of the data URL, not part of a base-64 string. You need to extract the base-64 data from the URL first.
Luckily, the UriData class can do this all for you:
final bytes = UriData.parse(base64Result).contentAsBytes();

format exception when using Image.memory to load base64 image in flutter

Now I am using this code to load a base64 image stream in flutter:
var foregroundImage;
if(counter.value.iconData != null && counter.value.iconData != "") {
Uint8List base64Decode(String source) => base64.decode(source);
Uint8List uint8list = base64Decode(counter.value.iconData);
foregroundImage = Image.memory(uint8list);
}else{
foregroundImage = defaultImage;
}
when the stream like this:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACXElEQVR4XsWXTU8TURSGu/AHuOnMlMbYWorKt1sVKDGiIf4BdUUQXWHiAnDXlERd4oJ+4rbFFa5w1fYvNE0wuJIFf8E0bZr2OO+UO7T3ozMEO3OSd3PPued5Z+a2995AQBKaFtV1PfRB041KUAudBzWjbYquqDbmoofVy+zJc4RIJBI3NM1ImpP+ShpeS+iJ3mDwXCsikcjN3hOLk/+nwABrAG49uQdwJrAG3gReDV80aoF5AY/qo/jmTuqtCXNhYoXySa8EdiCoG1U+4ZWwFgIXv3MhyWtyaloYU8l9bejcNDD8T2Z27gGdnPyibrdLpcPvpBtjQg0TcsXSoVWLOZjL13BqwwA/aAsN/pydUX8cHf2QmsAYcv2RyWQpNj4h1PZLaUAGZ8GbkMHz+QKlUrv06fOXoSakBnh4s9mk4+Ofl93p0oQKvrz8hHK5vKVhJgQDMvjLV6+tHBqzOD39Tfcnp6Rw1D58tEDpdMbRxICBmdl5JZwJAMCnZ+aUcKbHC4uCiTuxuNpAsViym7VaLQHOFJ+45whXmdh4+05toHDwzW7Y6XRoc/O90FD1zfk6pqcrzymbzdkG1tbW1QbG43epXq/bjXkT14Unkym6HYmqDahMrL/ZGAlcakBmAmvhKvCVZ+7gSgMQM1Gr1QR4oXAg1DMtLiVcwyGlAQgmyuWyazi0vf3RNRxy3IxgolKtUqPRoL29r0Ke1+rqC9pPp2lra8cRHuxtRu6247HwLWFMJSMUFsbkMrdjLw+jvKwDie9HMt8Ppb4fyxG+X0wQvl7NWPh6Oe0PL6/n/wCHXSY6hk0RUwAAAABJRU5ErkJggg==
show error formatexception: invalid character:
when I am parse the stream in web, it could parse successfully. why would this happen? what should I do to fix it?
The problem is that the actual base64 encoded image is after the "base64," word.
Since base64 can not contain comma symbol - you can just split the string by it and take the last part:
counter.value.iconData.split(',').last
base64Decode decodes pure base64, remove data:image/png;base64, and give rest to base64Decode function

How to get base64 of a file in Flutter

I have an file path string like
path = /data/user/0/com.digitalpathshalabd.school/cache/Shaiful_Islam.docx
now I want to convert the file into base64
How could I achieve this ?
Finally I come up with a solution.
The thing is we have to get the actual file from path before converting it.
get the actual file
convert the file into byte array
finaly convert the byte array to base64
import 'dart:convert';
import 'dart:io';
class FileConverter {
static String getBase64FormateFile(String path) {
File file = File(path);
print('File is = ' + file.toString());
List<int> fileInByte = file.readAsBytesSync();
String fileInBase64 = base64Encode(fileInByte);
return fileInBase64;
}
}