在Flutter iOS中将jpg图像转换为png图像

4

我该如何在Flutter中将从照片库选择的jpg图像转换为png图像?


1
将JPEG图像转换为PNG通常不是一个好主意。这只会无损地保留JPEG压缩已经引入的伪影,大多数情况下会导致文件更大。通常你可能想要进行这样的转换的时候是,如果你需要对文件执行多个编辑操作,并需要将中间步骤保存为无损格式,以避免复合压缩伪影。 - jamesdlin
5个回答

9

看一下image package。以下是示例部分中可用的片段,该片段将JPEG转换为PNG

import 'dart:io';
import 'package:image/image.dart';
void main() {
  // Read a jpeg image from file.
  Image image = decodeImage(new File('test.jpg').readAsBytesSync());

  // Resize the image to a 120x? thumbnail (maintaining the aspect ratio).
  Image thumbnail = copyResize(image, 120);

  // Save the thumbnail as a PNG.
  new File('out/thumbnail-test.png')
    ..writeAsBytesSync(encodePng(thumbnail));
}

应用程序在这一行 new File('out/thumbnail-test.png')..writeAsBytesSync(encodePng(thumbnail)); 卡住了,之后什么也没有发生。 - Chaythanya Nair
能否将png转换为jpeg?我想将画布上的图片写成jpeg格式。 - aiki93
始终返回黑色JPG文件而非实际输出。 var outputImage = decodeImage(File('$tempDir/qr_code.png').readAsBytesSync()); var thumbnail = copyResize(outputImage, width: 200); File('$tempDir/qr_code.jpg').writeAsBytesSync(encodeJpg(thumbnail)); - Kamlesh

3

首先,您需要导入IMAGE库。然后使用类似下面的自定义函数,您可以将JPG转换为PNG。

import 'package:flutter/material.dart';
import 'dart:io';
import 'dart:convert';
import 'package:image/image.dart' as Im;
import 'dart:math' as Math;
void jpgTOpng(path) async {
  File imagePath = File(path);
  //get temporary directory
  final tempDir = await getTemporaryDirectory();
  int rand = new Math.Random().nextInt(10000);
  //reading jpg image
  Im.Image image = Im.decodeImage(imagePath.readAsBytesSync());
  //decreasing the size of image- optional
  Im.Image smallerImage = Im.copyResize(image, width:800);
      //get converting and saving in file
  File compressedImage = new File('${tempDir.path}/img_$rand.png')..writeAsBytesSync(Im.encodePng(smallerImage, level:8));     
}

如何将PNG转换为JPG,请提供建议。谢谢。 - Kamlesh
可能已经太晚了,但是在这里可以找到答案:https://dev59.com/YsLra4cB1Zd3GeqPAARK#69078442 - i.r.b.a

1
使用image库,您可以做到这一点。
jpegToPng(jpegimage){
new File('output.png')
    ..writeAsBytesSync(encodePng(thumbnail));
}

如何将PNG转换为JPG,请提供建议。谢谢。 - Kamlesh
可能已经太晚了,但是在这里 https://dev59.com/YsLra4cB1Zd3GeqPAARK#69078442 - i.r.b.a

1
如果你直接使用字节进行工作,你可以按照以下步骤进行操作:
  import 'dart:typed_data';
  import 'package:image/image.dart';

  Uint8List jpgToPng(Uint8List bytes) {
    final jpgImage = decodeImage(bytes);
    final pngImage = copyResize(
      jpgImage!,
      width: jpgImage.width,
      height: jpgImage.height,
    );

    return Uint8List.fromList(encodePng(jpgImage));
  }

这将返回PNG字节,而无需您跟踪图像尺寸。

1
许多建议都很好,我只想补充一些可能会让一些人困惑的内容。如果您得到黑色图像,请查看图像中是否有 alpha 通道。
我使用 Image 包来实现我的目的,所以我只需要在解码过程中添加一个通道: img.decodeImage(imageFile.readAsBytesSync())..channels = img.Channels.rgba 我还使用 Image/Paint 方法将 Dart UI 图像转换为 .png:
img 是 Image 包中的缩略图图像。
import 'dart:ui' as ui;
import 'package:image/image.dart' as img;

    ui.Image imageN;
        try {
          final paint = await PaintingBinding.instance
              .instantiateImageCodec(img.encodePng(thumbnail, level: 0));
          final nextFrame = await paint.getNextFrame();
          imageN = nextFrame.image;
        } catch (e, s) {
          // handle the exception
        }
        return imageN;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接