在HTML Base64图像上转换Android Base64位图和显示(Convert Android Base64 Bitmap and Display on HTML Base64 Image)
我开发了一个自定义信使应用程序,它将客户端(Android)的消息发送到另一个客户端(Web)。 我的问题是当我发送图像文件时,我将其编码为
Base64
字符串,然后将其发送到另一个客户端。 当收件人客户端是Android时,该应用程序成功将Base64
字符串解码为位图图像。 但是当收件人客户端是Web应用程序时,Web应用程序无法解码并使用以下方式显示它:<img id="img" src="data:image/jpeg;base64,3iVBORw0KGgoAAAANSU...">
我的Java编码/解码方法
public static Bitmap base64StringToBitmap(String base64) { byte[] bytes = Base64.decode(base64, Base64.URL_SAFE); return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } public static String bitmapToBase64String(Bitmap bmp, Bitmap.CompressFormat format, int quality) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(format, quality, baos); byte[] bytes = baos.toByteArray(); return Base64.encodeToString(bytes, Base64.URL_SAFE); }
我试图将编码方法更改为
Base64.DEFAULT
,但仍然无法使用data:image/jpeg;base64
在HTML中显示Base64
字符串data:image/jpeg;base64
。 用于在HTML中显示图像的AndroidBase64
字符串和Base64
字符串之间是否存在任何差异? 请建议我的解决方案。 谢谢编辑:
这是从我的Android应用程序生成的base64字符串示例,带有填充。 我无法在html / web上显示它,虽然它可以在Android上正常显示:
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
I develop a custom messenger application which sends message from client(Android) to another client(web). My problem is when I send image file, I encoded it to
Base64
string and then send it to another client. When the recipient client is Android, the app successfully decoded theBase64
String to bitmap image. But when the recipient client is web app, the web application failed to decode and display it using :<img id="img" src="data:image/jpeg;base64,3iVBORw0KGgoAAAANSU...">
My Java encode/decode method
public static Bitmap base64StringToBitmap(String base64) { byte[] bytes = Base64.decode(base64, Base64.URL_SAFE); return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } public static String bitmapToBase64String(Bitmap bmp, Bitmap.CompressFormat format, int quality) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(format, quality, baos); byte[] bytes = baos.toByteArray(); return Base64.encodeToString(bytes, Base64.URL_SAFE); }
I've tried to change the encoding method to
Base64.DEFAULT
, but still theBase64
String cannot be displayed in HTML usingdata:image/jpeg;base64
. Is there any differences between AndroidBase64
string andBase64
string used to display image in HTML? Please suggest me the solution. ThanksEDIT :
This is the base64 string example generated from my Android application, with padding. I failed to display it on html/web, although it can be displayed fine on Android :
3iVBORw0KGgoAAAANSUhEUgAAAF8AAABfCAYAAACOTBv1AAAABHNCSVQICAgIfAhkiAAAChtJREFU eJzdnVtIVN8ex3/+R00r/6OWl6Kr0EOF51SioaHY3fB0ke4EmZn2kBGYRQ8VGEKnhNQ6BOXpxV6i IutAKBidE/HPfy9pRZCYnBSxmJSx0hq1cZ0HmWFf1tp77b0ue+Z8YcHoXuv3/a3P2nvPzN5r7QEI fRUCwL8AAFko4wBwCwD+6kC+YatFANAL1kBbKW0A4JLVmXBQCYiDbVaWSegfUREO+cYBwDc7DSMj IyE7OxtSU1MhISEBAAC8Xi90d3dDZ2en3Xw8AJBit3G4aB9Q7pXHjx9Hv379QqzyeDyooKDAytGQ LJWIBO0Bk07n5+czg6bR8PAwio+PpxmEBNFQRJ924gHAS9rodrtheHjYclCfzwcDAwPg9U6FTkhI gLS0NMtxBgcHISkpyayaU6dmJvmAsFdVVVWZ7qE+nw9t376d+U315MmTVEdEenq6UZxWKcQ46C9A 6MSlS5cMAVRUVAj/hNPU1GSYQ1ZWllH7kD4KvgAm6by8PGJn7969Kxw4qQwMDBDzioyMJLWrF0aP QdhkSVq/fr1j0LWltrYWm+PQ0BCpzbgQgjY0DTAJnj59Gtuh3Nxcx2GTSkNDAzbnlJQUUhtHtQow SeHU1NTkOFza4vV6dfl3dnaG1AAU4pLBiZB0SJf4+HgrfZF6vUgHfv78+bpEnXwz5VVGR0dpB0DK J6EMrfGWLVt0Cc6aNct2h91uN0IIoa1btwqHu2HDBtOjE/e9xOVy4eoKVbTWsLS0lNtppq2tTdrp anh42JIX7jQ0bdo0qQNgusdbhbB7925dDFHwr127xuylVUREhJQBUBnMmzfPdgeioqLQ+Pg4EQRP +Onp6aY+Vr0o2lq/YGWgQRsJYMvq1aupYPCA39vbS+Xz8OFDy7Epci3lAV53rYYF0pMnT6iAvH37 lhk+rVauXMklPqYOs7iBtwJkz5490uDbja899TY3N3MdANVl4VOnTqnMZs+eHXJAZHvdvHlTFSs6 Olpb55wd8L8bdebevXshCwQAUEREhDQviniWZdUgpOCfOXNGmpe2Xy9evNBu/24FvOqea25uLpdk d+3aJQ2Iz+ej8mltbeUCPzMz0yx/ahFH9fbt27YT7OrqogLy4cMHrnuikXJycrjAx3naGQDVXn/5 8mWzgNyBHDx4UBp8XuBxvpg3X1MRg+Xl5YUNEKfg9/T0GMX/YQQ+TllZezUvXIAkJiY6Bl/bT8y1 H6KIQfLz88MG/vXr1x2Fr7ysMTk5qd1+xRR+4Jo6ryQrKyulAaHVs2fPhMDX5oDZrlMJqbHdL1TK MjIyQgWkv79fGvx169ZJgV9XV2cK38rICQNy9OhRaV6iwAMAWrx4sZHXv4nw165d6xj8cPOizQOz PagFpEa8pvDJAkJ780QGfOUU9+rqaiJ81VIc3gnGxcVJA/Lo0aOQgb9q1Sojv7wAfOJeyiOJ+vp6 aUBo9fLlS+HwTVgO6eAfO3YsWPnnz5/cEzCSwdzIYNm3b5/hQNGqsLDQ1Es5fVAAfKSDrzxP7dix Qyr8EydOYNsvXboUW5/Fi5Tr4cOHdXVZJn8ppx6Wl5fr4BeSkucB3i6Q2NhYw8vC7e3t3Ly0l4O1 WrJkie2+l5eXB+Ngjmz1AmNSgrLgd3d3U9XFfUEqLCyk9nK73dQL7nj2XwuftqKtsmzZMmogVoTz 6ujokOYVFvAfPHggDYgoiYIfERgBgKkFxhMTE4E/ISKCfeLtlB9/4XKT6WVFyryUsX5TVsrJyQm+ 9vl8TIb/L7pyhXgFmFkq+HPmzAm+7uvrE2bKqvv370vzOnfO1rQbKqngJyYmBl97PB5hpqw6e/as 7n/l5eVCvH78MLzzxyQVfL/fH3wdExPDHLygoIA5Bk5dXV26/9XU1AjxEikV/M+fPwdfJyezP/9B JhCKZfwhJxX8/v7+4OsFCxYwB8/IyGCO4aS+f7c00cyyVPBfvXol1CzcJPLNNiBhX7JEqL6+XucT FRUlxIu1/xRMYTyc4M+cOVPnU1NTI8RLBvx/ioCvvJpHkt/vR26329JA4bz8fr9pu56eHgQAaMWK FUxeVovL5TKKCStEwPd4PMROaR+rkpSUxASEpLGxMRQbG6uq29LSwuRltVRXVwfjdXR06OADCVpV VRWXQw0hhI4cOUKse+vWLSYgWi1fvpw6L5LevXvHBb5SmGe9qeFv2rTJtLO0plevXrU1UCSNjIwQ 2+/fv5+rV1FREXf4mO1q+BQNuBdaVVZWSvMS0TfNtpcB+G3hAD/cvIqLi41ipgbgu5QblM8lYFmJ EmpADh06JBW+UpjTmErBDdqHPIgEv3HjRmlAjD6BiYaP2Y6HT9GQW7Fy35UnDCO1tLQwe5WUlBjl /nct/KXKCl++fAk2/PTpkzD4tOru7pbmlZGRwdVr27Zthnt9QNL3flrt3btXmherj3YBNqYOVh5S srW1tY7CZ/WZMWOGNC+lent7tdv/RoIPyoraOTfhDN+pybqY7YYiBmpoaOAKXuYSfSvi5TM2Nqbd /sIM/mxlg6ysLK4QlIXmaVOy4Tc2Ntr2mD59ulnOVCIm7vV6ucGn1dOnT6V5JScnc/HALOz7Ly38 BGVD7Z0iyof/cwOSnZ0tzctufO1zdzB1LEnVeGhoiEuSMoEESnZ2tnAvpYqLi7Xbm63C1w2AUqOj o0xAFi5cKA3+8+fPhXpRxLClVmWQlJQUlQnLzZY7d+5Ig0+riYkJy7G/fv1qlusiu/BBG6yzs1Nl FrgHKwqITPjnz5+3FPfixYuq9mvWrNHWYX7OfmAauZXDjBsQHo9+pxXh+cjYol3v+/r1a1w9LrrC ewBolZiYKA0+bbzU1FSatr/zgg+gmd/DOgBmYn2wUqBUVFQY+vj9fuxcIEbw/+AJPiCViXZOCu0A FBUVYUHcuHGDC3Bl+fbtG9brwIEDlmPh5vxg6o1yp66QyiwmJkaX0Ny5cw078f79+2DdwcFB7sCV RanHjx/bjqN91pzBjiZcKkPcA0SN9mKETH8UjFsZHx9HUVFRTDG0Hyd5gbe70ssFAL+0/0SYBWk8 FtU5KQt9stzR38yrYOXHtSWtEMzMzLRp45waGxt14N+8ecMNPC/pDr/m5mbsmxyubqiV2NhYbO6Y L1DSzvFm0iVFmjMfmC0cioUkQn1xK+VsaBgwSba3t2M71NfX5zhsAOOnjWOuTgaKkM/xrCoFi3sV QgilpaVJh240e21gYMCoLddvriKETTw6OtpwECYmJmz/hAZNMZsuiLnnqiwh82OUNDoPBiAmJycN QSA09ZPZZWVltkC7XC504cIFUw+EEPr48aNZvEVSiAnQdzDoWF1dHRUgEaL4pekHDvASItO9lXZP ZdHOnTtpjpyPsuHI0k+gPHWUlZXp7h1bUUdHB9q8ebOV09UfUkk4KN09AgfLVsF9DWn9B+QDvySj Y+GmXJh64Cdv2H+CYilOKOh/G/IaeDiFexQAAAAASUVORK5CYII=
原文:https://stackoverflow.com/questions/22031636
最满意答案
TestClass
是无状态的。 那么为什么你想传递一个非静态成员函数呢? 如果在真实代码中需要访问非静态成员,则还需要传递该对象template<class T, class C> T Convert( HRESULT (C::*Foo)(T*), C c) { T temp; (c.*Foo)(&temp); //Throw if HRESULT is a failure return temp; }
假设成员函数是公开的,你可以像下面这样调用它
TestClass c; Convert(&TestClass::Converter, c);
如果该类是重量较轻的,或者该函数在执行期间更改了其对象,则可以决定将该对象传递给按引用进行
Convert
。
TestClass
is stateless. So why do you want to pass a non-static member function? If in the real code you need access to non-static members, you also need to pass the object alongtemplate<class T, class C> T Convert( HRESULT (C::*Foo)(T*), C c) { T temp; (c.*Foo)(&temp); //Throw if HRESULT is a failure return temp; }
You can then call it like the following, assuming the member function is made public
TestClass c; Convert(&TestClass::Converter, c);
If the class is heavy-weight or if the function changes its object during execution, you may decide to pass the object to
Convert
by reference.
相关问答
更多-
您可以使用一个独立的函数来调用将您的实例绑定到它的包装器。 这是一个粗略的例子 #include
#include #include // global function which works std::function memberCb; void task_global(float x, float y) { memberCb(x, y); } typedef void(*f_pointer)( ... -
你必须知道如何调用这些方法。 ex::show(); (...) obj->show(); 是(通常可能)由您的特定编译器翻译为: show(ex * this); (...) show(obj); 因为你不在里面使用this ,所以没有理由抛出异常...... 我强调了你的特定编译器 ,因为: C ++标准,第8.3.2章,参考文献 [注意:特别是,在一个定义良好的程序中不能存在空引用,因为创建这样一个引用的唯一方法是将它绑定到通过空指针间接获得的“对象”,这会导致未定义的行为 。 如9.6中所述 ...
-
函数指向成员函数的指针(Function pointer to member function)[2022-04-20]
语法错误 成员指针是与普通指针不同的类型。 成员指针必须与其类的对象一起使用: class A { public: int f(); int (A::*x)(); // <- declare by saying what class it is a pointer to }; int A::f() { return 1; } int main() { A a; a.x = &A::f; // use the :: syntax printf("%d\n",(a.*(a.x))()); // ... -
在这种情况下,我是否需要定义复制构造函数和/或析构函数? 不可以。会员功能指针是可复制的,在销毁之前不需要任何特殊处理。 默认函数将做正确的事情。 我不确定默认的析构函数,因为涉及指针。 如果指针指向需要手动清理的某些资源,则只需要存在指针的析构函数; 例如,如果您使用new分配了一些内容。 在这种情况下,您可能根本不需要指针,而是智能指针,容器或其他RAII对象,而不是玩杂耍指针并希望您不要丢弃它。 Do I need to define a copy-constructor and/or destruc ...
-
指向成员函数的指针(pointer to member function)[2021-11-18]
以下是您想要的语法: vectorTable::filter(string s, string (Row::*get)() const) { //^^^^^^^^^^^^^^^^^^^^^^^^^^^ member pointer ... if(((*it).*get)() == s) { // call using the (*it). and not it-> ... } 称之为: vector v ... -
func是一个非静态成员函数。 它需要一个myclass对象来操作(函数内部将指向的那个对象)。 就好像该函数有一个不可见的myclass参数。 fptr2是没有任何参数的函数的函数指针,所以赋值被拒绝。 以下是一些替代解决方案: 使func静态。 将fptr2的类型更改为指向成员的指针。 不要使用原始函数指针; 切换到C ++ 11 lambda和/或std::function 。 这是后者的一个例子: std::function
f2; f2 = [&]{ obj.func(); }; ... -
指向成员函数的问题(pointer to member function question)[2022-12-18]
TestClass是无状态的。 那么为什么你想传递一个非静态成员函数呢? 如果在真实代码中需要访问非静态成员,则还需要传递该对象 templateT Convert( HRESULT (C::*Foo)(T*), C c) { T temp; (c.*Foo)(&temp); //Throw if HRESULT is a failure return temp; } 假设成员函数是公开的,你可以像下面这样调用它 TestClass c; Co ... -
运行优先级.*和->*是,恕我直言,打破了。 您需要将操作数包装在括号中才能调用。 return (this->*MyFunc)(a); 否则,编译器认为你正在这样做this->*(MyFunc(a)) ,这显然是无效的。 有趣的是, (this->*MyFunc)作为一个独立的表达式也是无效的。 它需要在现场调用。 The operator precedence of .* and ->* is, IMHO, broken. You need to wrap the operands in parent ...
-
运算符地址(即operator& )必须形成指向成员函数的指针。 由于函数到指针的隐式转换,它对于指向非成员函数或静态成员函数的指针是可选的 。 可以使用非成员函数的地址或静态成员函数初始化指向函数的指针。 由于函数到指针的隐式转换,address-of运算符是可选的。 但是函数到指针隐式转换不适用于非静态成员函数。 函数类型T的左值可以隐式转换为该函数的prvalue指针。 这不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。 顺便说一句:我试过用Gcc头版和Clang头版 ,两者都无法编译。 ...
-
我不能真正依赖你的代码,因为它充满了错误,所以这就是它应该如何使用简化版本: class A { } ; class B { } ; class BaseClass { public: virtual void log () { std::cout << "Log BaseClass." << std::endl ; } }; template
class TVector : public BaseClass { } ; template < ...