将图像(最大200 KB)转换为Base64字符串的代码是什么?

我需要知道如何使用Android,因为我必须添加功能才能将图像上传到我的主应用程序中的远程服务器,将它们作为字符串放入数据库的一行中。

我正在Google和Stack Overflow中进行搜索,但找不到适合我的简单示例,我也找到了一些例子,但他们并不是在谈论将其转换为字符串。然后,我需要转换为字符串以通过JSON上传到我的远程服务器。

#1 楼

您可以使用Base64 Android类:

String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);


但是您必须将图像转换为字节数组。例如:

Bitmap bm = BitmapFactory.decodeFile("/path/to/image.jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); // bm is the bitmap object
byte[] b = baos.toByteArray();


*更新*

如果您使用的是较旧的SDK库(因为您希望它可以在手机上使用) (使用较早版本的OS)将不会打包Base64类(因为它刚刚出现在API级别8 AKA 2.2版中)。

查看本文以获取解决方法: />
如何对Android进行base64编码解码

评论


好的,他们我可以使用PHP + JSON将String(encondedImage)放入远程数据库列中?夹心类型必须是数据库的列? VARCHAR?

– NullPointerException
11年1月28日在19:46

好吧,使用VARCHAR,您需要指定它的大小,因此TEXT可能会更好。图片可以是任何大小范围...

– xil3
11年1月28日在19:52

嗨,我正在测试它,但它给我Base64错误。它不能欺骗班级。我通过Ctrl + shift + O来获取导入,但没有获取导入...¿如何解决呢?

– NullPointerException
2011年1月29日上午10:49

对我来说,替换后正在工作:字符串encodingImage = Base64.encode(byteArrayImage,Base64.DEFAULT);通过:字符串encodingImage = Base64.encodeToString(byteArrayImage,Base64.DEFAULT);

–PakitoV
2011年7月19日15:58



有人意识到这种方法对文件无意义的重新压缩吗?为什么这么反对? Chandra Sekhar的答案是最有效的。

– ElYeante
13-10-17在19:45

#2 楼

除了使用Bitmap之外,您还可以通过简单的InputStream进行此操作。好吧,我不确定,但是我认为这样做有点效率。

InputStream inputStream = new FileInputStream(fileName); // You can get an inputStream using any I/O API
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();

try {
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
    }
}
catch (IOException e) {
    e.printStackTrace();
}

bytes = output.toByteArray();
String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);


评论


当然,这更有效。只是将文件转换为其base64表示形式,并避免了图像的绝对无意义的重新压缩。

– ElYeante
13-10-17在19:50

是fileName此处是文件的路径还是实际的文件名?请不要忘记给我加上标签:)谢谢。

–Rakeeb Rajbhandari
13年11月27日在10:59

@ user2247689显然,当您尝试访问文件时,必须提供文件的完整路径,包括文件名。如果文件位于源程序所在的路径中,则文件名就足够了。

–钱德拉·塞卡(Chandra Sekhar)
13年11月27日在13:20

问题是“ 8192”在这里表示什么,它是文件大小还是什么?

–德维什·坎德尔瓦尔(Devesh Khandelwal)
15年6月28日在9:37

此代码无法正常工作,浪费了我很多时间来解决该问题。

–拉姆克什·雅达夫(Ramkesh Yadav)
19年2月1日在10:48

#3 楼

如果您需要基于JSON的Base64,请查看Jackson:它在低级别(JsonParser,JsonGenerator)和数据绑定级别都对作为Base64的二进制数据读/写提供了明确的支持。因此,您只需要具有byte []属性的POJO,就可以自动处理编码/解码。

也很有效,应该很重要。

评论


对我来说太难了,我的技能很低,我在google上检查了它,找不到简单的示例...也许如果您能给我像xil3这样的代码示例,我会理解的

– NullPointerException
11年1月28日在19:47



#4 楼

// Put the image file path into this method
public static String getFileToByte(String filePath){
    Bitmap bmp = null;
    ByteArrayOutputStream bos = null;
    byte[] bt = null;
    String encodeString = null;
    try{
        bmp = BitmapFactory.decodeFile(filePath);
        bos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);
        bt = bos.toByteArray();
        encodeString = Base64.encodeToString(bt, Base64.DEFAULT);
    }
    catch (Exception e){
      e.printStackTrace();
    }
    return encodeString;
}


#5 楼

该代码在我的项目中运行完美:

profile_image.buildDrawingCache();
Bitmap bmap = profile_image.getDrawingCache();
String encodedImageData = getEncoded64ImageStringFromBitmap(bmap);


public String getEncoded64ImageStringFromBitmap(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 70, stream);
    byte[] byteFormat = stream.toByteArray();

    // Get the Base64 string
    String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

    return imgString;
}


#6 楼

如果您是在Android上执行此操作,那么以下是从React Native代码库复制的帮助程序:

import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import android.util.Base64;
import android.util.Base64OutputStream;
import android.util.Log;

// You probably don't want to do this with large files
// (will allocate a large string and can cause an OOM crash).
private String readFileAsBase64String(String path) {
  try {
    InputStream is = new FileInputStream(path);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Base64OutputStream b64os = new Base64OutputStream(baos, Base64.DEFAULT);
    byte[] buffer = new byte[8192];
    int bytesRead;
    try {
      while ((bytesRead = is.read(buffer)) > -1) {
        b64os.write(buffer, 0, bytesRead);
      }
      return baos.toString();
    } catch (IOException e) {
      Log.e(TAG, "Cannot read file " + path, e);
      // Or throw if you prefer
      return "";
    } finally {
      closeQuietly(is);
      closeQuietly(b64os); // This also closes baos
    }
  } catch (FileNotFoundException e) {
    Log.e(TAG, "File not found " + path, e);
    // Or throw if you prefer
    return "";
  }
}

private static void closeQuietly(Closeable closeable) {
  try {
    closeable.close();
  } catch (IOException e) {
  }
}


评论


(将分配大字符串并可能导致OOM崩溃)那么在这种情况下,解决方案是什么?

–易卜拉欣·迪索基(Ibrahim Disouki)
17年6月21日在20:43

#7 楼

这是Kotlin中的编码和解码代码:

 fun encode(imageUri: Uri): String {
    val input = activity.getContentResolver().openInputStream(imageUri)
    val image = BitmapFactory.decodeStream(input , null, null)

    // Encode image to base64 string
    val baos = ByteArrayOutputStream()
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    var imageBytes = baos.toByteArray()
    val imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT)
    return imageString
}

fun decode(imageString: String) {

    // Decode base64 string to image
    val imageBytes = Base64.decode(imageString, Base64.DEFAULT)
    val decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)

    imageview.setImageBitmap(decodedImage)
}


#8 楼

对于那些寻求将图像文件转换为Base64字符串而不进行压缩或先将其转换为位图的有效方法的人,您可以改为将文件编码为base64

val base64EncodedImage = FileInputStream(imageItem.localSrc).use {inputStream - >
    ByteArrayOutputStream().use {outputStream - >
            Base64OutputStream(outputStream, Base64.DEFAULT).use {
                base64FilterStream - >
                    inputStream.copyTo(base64FilterStream)
                base64FilterStream.flush()
                outputStream.toString()
            }
      }
}


希望这会有所帮助!

#9 楼

byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);


评论


尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。

–唐老鸭
17年1月10日在19:34

一个解释将是有条理的。

– Peter Mortensen
5月4日12:23

#10 楼

以下是可能帮助您的伪代码:

public  String getBase64FromFile(String path)
{
    Bitmap bmp = null;
    ByteArrayOutputStream baos = null;
    byte[] baat = null;
    String encodeString = null;
    try
    {
        bmp = BitmapFactory.decodeFile(path);
        baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        baat = baos.toByteArray();
        encodeString = Base64.encodeToString(baat, Base64.DEFAULT);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

   return encodeString;
}


#11 楼

在Android中将图像转换为Base64字符串:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.yourimage);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);


#12 楼

这是用于图像编码和图像解码的代码。

在XML文件中

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="yyuyuyuuyuyuyu"
    android:id="@+id/tv5"
/>


在Java文件中:

TextView textView5;
Bitmap bitmap;

textView5 = (TextView) findViewById(R.id.tv5);

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo);

new AsyncTask<Void, Void, String>() {
    @Override
    protected String doInBackground(Void... voids) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
        byte[] byteFormat = stream.toByteArray();

        // Get the Base64 string
        String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

        return imgString;
    }

    @Override
    protected void onPostExecute(String s) {
       textView5.setText(s);
    }
}.execute();


评论


会实际编译吗?你有遗漏什么吗?

– Peter Mortensen
5月4日12:37

#13 楼

我做一个静态函数。我认为它更有效。
public static String file2Base64(String filePath) {
        FileInputStream fis = null;
        String base64String = "";
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            fis = new FileInputStream(filePath);
            byte[] buffer = new byte[1024 * 100];
            int count = 0;
            while ((count = fis.read(buffer)) != -1) {
                bos.write(buffer, 0, count);
            }
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        base64String = Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT);
        return base64String;

    }

简单又容易!

评论


它在字符串中添加了下一行,我们可以克服这一点吗?

– GvSharma
10月29日12:19

#14 楼

使用此代码:

byte[] decodedString = Base64.decode(Base64String.getBytes(), Base64.DEFAULT);

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);


评论


恰恰相反

–拉斐尔·鲁伊斯·穆尼兹(Rafael RuizMuñoz)
17年8月10日在14:39