আমি কীভাবে কোনও চিত্রকে বেস 64 স্ট্রিংয়ে রূপান্তর করতে পারি?


143

কোনও চিত্র (সর্বোচ্চ 200 কেবি) একটি বেস 64 স্ট্রিংয়ে রূপান্তর করার কোডটি কী?

অ্যান্ড্রয়েড দিয়ে এটি কীভাবে করা যায় তা আমার জানতে হবে, কারণ আমার মূল অ্যাপ্লিকেশনটিতে একটি রিমোট সার্ভারে চিত্রগুলি আপলোড করার জন্য কার্যকারিতা যুক্ত করতে হবে, সেগুলি স্ট্রিং হিসাবে ডাটাবেসের একটি সারিতে রেখে।

আমি গুগল এবং স্ট্যাক ওভারফ্লোতে অনুসন্ধান করছি, তবে আমি সামর্থ্যবান এমন সহজ উদাহরণগুলি খুঁজে পেলাম না এবং আমি কয়েকটি উদাহরণও পেয়েছি, তবে তারা স্ট্রিংয়ে রূপান্তরিত করার বিষয়ে কথা বলছে না। তারপরে আমার দূরবর্তী সার্ভারে জেএসওএন দ্বারা আপলোড করার জন্য আমার একটি স্ট্রিংয়ে রূপান্তর করা দরকার।

উত্তর:


330

আপনি বেস 64 অ্যান্ড্রয়েড বর্গ ব্যবহার করতে পারেন:

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();

* হালনাগাদ *

আপনি যদি কোনও পুরানো এসডিকে গ্রন্থাগার ব্যবহার করছেন (কারণ আপনি এটি ওএস এর পুরানো সংস্করণ সহ ফোনগুলিতে কাজ করতে চান) আপনার বেস 64 ক্লাসটি প্যাকেজড থাকবে না (যেহেতু এটি কেবলমাত্র API স্তরের 8 একেএ সংস্করণ ২.২ এ প্রকাশিত হয়েছে)।

একটি নিখরচায় এই নিবন্ধটি দেখুন:

অ্যানড্রয়েড ডিকোড অ্যানড্রয়েড বেসড কিভাবে


ঠিক আছে, এবং তাদের আমি পিএইচপি + জেএসওএন দিয়ে একটি স্ট্রিং (এনকনডেড ইমেজ) একটি রিমোট ডাটাবেস কলামে রাখতে পারি ???? কোন্ ডেটাবেসের কলাম হতে হবে? VARCHAR?
নালপয়েন্টার এক্সসেপশন

ঠিক আছে, ভর্চারের সাহায্যে আপনাকে এটি কতটা বড় হতে হবে তা নির্দিষ্ট করতে হবে, তাই সম্ভবত টেক্সট আরও ভাল। চিত্র আকারের যে কোনও ব্যাপ্তি হতে পারে ...
xil3

হাই, আমি এটি পরীক্ষা করছি তবে এটি আমাকে বেস 64 এ ERROR দেয়। এটা ক্লাস জিন্ড করতে পারে না। আমদানি পেতে আমি সিটিআরএল + শিফট + ও করি তবে আমদানি হয় না ... solve কীভাবে এটি সমাধান করবেন?
নালপয়েন্টার এক্সসেপশন

4
আমার জন্য প্রতিস্থাপনের পরে কাজ করছিল: স্ট্রিং এনকোডডআইজেজ = বেস64.encode (বাইটআরআইআইমেজ, বেস64.DEFAULT); লিখেছেন: স্ট্রিং এনকোডডআইজেজ = বেস64.encodeToString (বাইটআরআইআইমেজ, বেস64.DEFAULT);
পাকিতোভি

3
কেউ কি বুঝতে পারে যে এই পদ্ধতিটি ফাইলটির অর্থহীন পুনরায় সংশোধন করে ?? কেন এই এত upvated হয় ?? চন্দ্র শেখরের উত্তর সবচেয়ে দক্ষ।
এলয়্যান্তে

103

ব্যবহারের পরিবর্তে 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);

3
অবশ্যই এটি আরও দক্ষ; কেবল একটি ফাইলকে তার বেস 64 প্রতিনিধিত্বতে রূপান্তরিত করে এবং চিত্রটির একেবারে অর্থহীন পুনরায় সংযোজন এড়িয়ে চলে।
এলায়ান্টে

এখানে কি ফাইলনাম ফাইলের পথ বা আসল ফাইলের নাম ??? আমাকে ট্যাগ করতে ভুলবেন না :) ধন্যবাদ।
রাকিব রাজভান্ডারী

2
@ user2247689 আপনি যখন কোনও ফাইল অ্যাক্সেস করার চেষ্টা করছেন তখন স্পষ্টতই আপনাকে ফাইলটির নাম সহ পুরো পথটি দিতে হবে। যদি আপনার উত্স প্রোগ্রামটি উপস্থিত থাকে সেই পথে যদি ফাইলটি উপস্থিত থাকে তবে ফাইলটির নামই যথেষ্ট।
চন্দ্র শেখর

2
একটি প্রশ্ন, '8192' এখানে কী বোঝায়, এটি ফাইলের আকার বা কী?
দেবেশ খানদেলওয়াল

1
এই কোডটি কাজ করছে না, সমস্যাটি যুক্ত করতে আমার অনেক ঘন্টা নষ্ট করে।
রামকেশ যাদব

7

আপনি JSON উপর করুন Base64- প্রয়োজন হয়, তাহলে খুঁজে বার করো জ্যাকসন : এটা স্পষ্ট সমর্থন বাইনারি ডেটার জন্য পড়া / উভয় নিম্ন স্তরের (JsonParser, JsonGenerator) এবং করুন Base64- যেমন লেখ হয়েছে ডেটা-বাঁধাই স্তর। সুতরাং আপনি কেবল POJOs রাখতে পারেন বাইট [] বৈশিষ্ট্যযুক্ত থাকতে পারে এবং এনকোডিং / ডিকোডিং স্বয়ংক্রিয়ভাবে পরিচালিত হবে।

এবং বেশ দক্ষতার সাথেও, বিষয়টি হওয়া উচিত।


1
আমার পক্ষে খুব শক্ত, আমার দক্ষতা এটির সাথে খুব কম, আমি এটি গুগলে পরীক্ষা করেছি এবং সহজ উদাহরণগুলি খুঁজে পাচ্ছি না ... আপনি যদি আমাকে xil3 এর মতো কোড উদাহরণ দিতে পারেন তবে আমি এটি বুঝতে পারব
নালপয়েন্টারএক্সেপশন

5
// 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;
}

3

এই কোডটি আমার প্রকল্পে নিখুঁতভাবে চলে:

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;
}

2

আপনি যদি অ্যান্ড্রয়েডে এটি করছেন , তবে এখানে একটি সহায়িকার প্রতিক্রিয়া নেটিভ কোডবেজ থেকে অনুলিপি করা হয়েছে :

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) {
  }
}

2
(একটি বড় স্ট্রিং বরাদ্দ করবে এবং একটি OOM ক্র্যাশ ঘটাতে পারে) সুতরাং এই ক্ষেত্রে সমাধান কী?
ইব্রাহিম দিশৌকি

1

এখানে কোটলিনে এনকোডিং এবং ডিকোডিং কোডটি রয়েছে:

 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)
}

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

6
এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে সে সম্পর্কে অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
ডোনাল্ড হাঁস

একটি ব্যাখ্যা ক্রম হবে।
পিটার মর্টেনসেন

0

নীচে সিউডোকোড যা আপনাকে সহায়তা করতে পারে:

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;
}

0

কোনও চিত্রকে অ্যান্ড্রয়েডে বেস 64 স্ট্রিংয়ে রূপান্তর করুন:

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);

0

এখানে চিত্রের এনকোডিং এবং চিত্র ডিকোডিংয়ের কোড রয়েছে।

একটি এক্সএমএল ফাইলে

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

একটি জাভা ফাইলে:

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();

এটি কি আসলে সংকলন করবে? তুমি কিছু ফেলে রেখেছ?
পিটার মর্টেনসেন

0

কোনও চিত্রের ফাইলটি সংক্ষেপণ ছাড়াই একটি বেস 64 স্ট্রিনে রূপান্তর করতে বা ফাইলটিকে প্রথমে বিটম্যাপে রূপান্তর করতে দক্ষ পদ্ধতিটির সন্ধানকারীদের জন্য, আপনি পরিবর্তে ফাইলটি বেস 64 হিসাবে এনকোড করতে পারেন

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

আশাকরি এটা সাহায্য করবে!


-1

এই কোডটি ব্যবহার করুন:

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

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

এটি ঠিক বিপরীত
রাফায়েল রুইজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.