RailTracer
RailTracer

Reputation: 123

Flutter/Dart rewriting image in the same format

After reading an image with the ImageDescriptor API and resizing it by instantiating a codec I am trying to write the resized version in the application directory.

I saw that the when converting the frame into byte data I have a format which is rawUnmodified which I assumed would write the resized image in the same format as the original image. But when I tried to load the resized image I get an image format exception.

Example code:

    //read the original image and obtain the image descriptor
    var imageData = await file.readAsBytes(); 
    final ImmutableBuffer buffer = await ImmutableBuffer.fromUint8List(imageData);
    final imDescr = await ImageDescriptor.encoded(buffer);

    //resize the image, get the first frame and convert it to bytes
    Codec codec = await imDescr.instantiateCodec(targetWidth: 100, targetHeight: 100);
    FrameInfo frameInfo = await codec.getNextFrame();
    var bytes = await frameInfo.image.toByteData(
      format: ImageByteFormat.rawUnmodified,
      //note when using the png format it works, but I would like to have it in the original image format(in this case its jpg)
    );
    
    //write the resized image
    Directory appDir = await getApplicationDocumentsDirectory();
    var path = appDir.path;
    var file = File('$path/test1.jpg');
    await file.writeAsBytes(bytes.buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));

In the ImageByteFormat api it says: rawUnmodified -> Unencoded bytes, in the image's existing format. For example, a grayscale image may use a single 8-bit channel for each pixel.

But when I try to show this image the format is wrong. Anybody have an idea how to fix this?

Upvotes: 1

Views: 1044

Answers (1)

Ishanga Vidusha
Ishanga Vidusha

Reputation: 304

Why use image ImageDescriptor, You can do it easily by image package

File resizeImage(File imageFile, String imageFormat, int targetWidth, int targetHeight) {
  im.Image tempImage = im.decodeImage(imageFile.readAsBytesSync());
  tempImage = im.bakeOrientation(tempImage);
  tempImage = im.copyResize(tempImage, width: targetWidth, height: targetHeight);
  File newImage;
  if (imageFormat == 'jpg') {
     newImage =  File('newpath/test.jpg');
     newImage.writeAsBytesSync(im.encodeJpg(tempImage));
     return newImage;
  } else if (imageFormat == 'png') {
    newImage =  File('newpath/test.png');
     newImage.writeAsBytesSync(im.encodePng(tempImage));
     return newImage;
  } else {
    throw ('Unknown Image Format');
  }
}

Upvotes: 1

Related Questions