将base64字符串转换为图像

Abs*_*Abs 34 java ajax grails base64 image

我正在尝试使用jquery插件(即crop.js)裁剪/调整用户配置文件图像,它通过ajax将用户图像作为base64发送到我的控制器

$.ajax({
         type: "post",
         dataType: "json",
         url: "${g.createLink(controller: 'personalDetail', action:'uploadUserImage')}",
         data: { avatar: canvas.toDataURL() }

        });
Run Code Online (Sandbox Code Playgroud)

但我无法解码这个base64

'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...==' 
Run Code Online (Sandbox Code Playgroud)

字符串作为图像,你们可以指导我如何将我的base64字符串保存为我的服务器上的图像?

geo*_*geo 59

在服务器中,执行以下操作:

假设

String data = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...=='
Run Code Online (Sandbox Code Playgroud)

然后:

String base64Image = data.split(",")[1];
byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);
Run Code Online (Sandbox Code Playgroud)

然后你可以用以下字节做任何你喜欢的事情:

BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageBytes));
Run Code Online (Sandbox Code Playgroud)

  • 这个“javax.xml.bind.DatatypeConverter.parseBase64Binary”比使用字符串中的“.getBytes()”方法更好 (2认同)

Jos*_*ore 50

这假设了一些事情,您知道输出文件名是什么以及您的数据是否为字符串.我相信您可以修改以下内容以满足您的需求:

// Needed Imports
import java.io.ByteArrayInputStream;
import sun.misc.BASE64Decoder;


def sourceData = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...==';

// tokenize the data
def parts = sourceData.tokenize(",");
def imageString = parts[1];

// create a buffered image
BufferedImage image = null;
byte[] imageByte;

BASE64Decoder decoder = new BASE64Decoder();
imageByte = decoder.decodeBuffer(imageString);
ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
image = ImageIO.read(bis);
bis.close();

// write the image to a file
File outputfile = new File("image.png");
ImageIO.write(image, "png", outputfile);
Run Code Online (Sandbox Code Playgroud)

请注意,这只是涉及哪些部分的示例.我根本没有对这段代码进行优化,而且它已经完全脱离了我的脑海.

  • @Lucky Groovy在行尾不需要分号. (5认同)
  • 如果打算使用JDK> 8,则此代码将无法工作,因为在JDK 8中无法访问Base64Decoder。我更喜欢在Base64Decoder或sun。***软件包中的任何类上使用javax.xml.bind.DatatypeConverter。 (2认同)

小智 9

ImageIO.write()将默认压缩图像 - 压缩图像的尺寸较小,但有时看起来很奇怪.我BufferedOutputStream用来保存字节数组 - 这将保持原始图像大小.

这是代码:

import javax.xml.bind.DatatypeConverter;
import java.io.*;

public class ImageTest {
    public static void main(String[] args) {
        String base64String = "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAAB5C...";
        String[] strings = base64String.split(",");
        String extension;
        switch (strings[0]) {//check image's extension
            case "data:image/jpeg;base64":
                extension = "jpeg";
                break;
            case "data:image/png;base64":
                extension = "png";
                break;
            default://should write cases for more images types
                extension = "jpg";
                break;
        }
        //convert base64 string to binary data
        byte[] data = DatatypeConverter.parseBase64Binary(strings[1]);
        String path = "C:\\Users\\Ene\\Desktop\\test_image." + extension;
        File file = new File(path);
        try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file))) {
            outputStream.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


iam*_*ddy 5

服务器端将文件/图像编码为 base64String 可供客户端使用

public Optional<String> InputStreamToBase64(Optional<InputStream> inputStream) throws IOException{
    if (inputStream.isPresent()) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        FileCopyUtils.copy(inputStream.get(), output);
        //TODO retrieve content type from file, & replace png below with it
        return Optional.ofNullable("data:image/png;base64," + DatatypeConverter.printBase64Binary(output.toByteArray()));
    }

    return Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)

服务器端base64图像/文件解码器

public Optional<InputStream> Base64InputStream(Optional<String> base64String)throws IOException {
    if (base64String.isPresent()) {
        return Optional.ofNullable(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(base64String.get())));
    }

    return Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)


Ple*_*rds 5

解码:

byte[] image = Base64.getDecoder().decode(base64string);
Run Code Online (Sandbox Code Playgroud)

编码:

String text = Base64.getEncoder().encodeToString(imageData);
Run Code Online (Sandbox Code Playgroud)