Я возвращаю изображение как base64 string
на стороне сервера. В клиентском приложении принимает эту строку base64 и преобразовать ее в byte[]
а затем Bitmap
и на последнем шаге устанавливает этот растр ImageView
, Моя проблема качество возвращаемого изображения. Выглядит плохо; Я могу видеть пиксели этого изображения …
Клиентская сторона (загрузка):
BitmapFactory.Options options = null;
options = new BitmapFactory.Options();
options.inSampleSize = 3;
bitmap = BitmapFactory.decodeFile(imgPath, options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
// Must compress the Image to reduce image size to make upload easy
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byte_arr = stream.toByteArray();
// Encode Image to String
encodedString = Base64.encodeToString(byte_arr, 0);
Сторона сервера (принимает загруженное изображение):
$_image = $_REQUEST['image'];
$binary = base64_decode($_image);
// for inserting it to db...
$sql = "INSERT INTO users (`_profile_pic`) VALUES ('$_image')";
$connect->query($sql);
Сторона сервера (получает строку base64 из базы данных)
$user_data = "SELECT _name, _profile_pic FROM users WHERE _id = {$_id}";
$data = $connect->query($user_data);
while ($row = $data->fetch(\PDO::FETCH_ASSOC))
$collectedResult[] = $row;
echo json_encode($collectedResult, JSON_UNESCAPED_UNICODE);
Клиентская часть (устанавливает изображение в ImageView (проблемная часть))
_picture = (ImageView) findViewById(R.id.profile_imageView);
byte[] decodedString = Base64.decode(profile_pic_value, Base64.DEFAULT);
Bitmap bmp = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
_picture.setImageBitmap(bmp);
На данный момент я не знаю, как восстановить или повысить качество.
Любой полезный комментарий, ответ приветствуется.
С Уважением,
Мирджалал.
P.S. Этот вопрос может быть дубликатом другого вопроса (ов), но я не смог найти дубликат. : D
я нашел этот но я не знаю, как использовать.
Возможно, вы теряете глубину цвета при декодировании в ОЗУ. У Android есть настройки по умолчанию, в какой цветовой формат он декодирует растровые изображения. Смотрите следующий пример, который экономит ОЗУ, но сохраняет приемлемое качество изображения.
public static Bitmap decodeBase64(String input) {
byte[] decodedByte = Base64.decode(input, Base64.DEFAULT);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length, options);
}
Присмотритесь Bitmap.Config.RGB_565
параметр.
Других решений пока нет …