将string类型的图片地址转换成bitmap类型

如题。。。。。。求大神解决

var sert = db.T_GrowData.Where(e => e.dateSubmit == bitdata.dateSubmit && e.status == 1).FirstOrDefault().value;

Bitmap one = new Bitmap(sert);           //报错:参数无效

2个回答

js?

没搞过。。。。。。

Dragon_2013
讽刺之城俄亥俄 这个是不js,就是一个类型的转换:string类型的图片地址转换成bitmap类型的
4 年多之前 回复

string类型的图片地址转换成bitmap类型? string类型 :“www.baidu.com/a.jpg” 转换为 bmp? www.baidu.com/a.bmp 这样吗?
如果是string类型,就没必要转换了,如果是转换图片格式,好像可以转换的。,。。。

Dragon_2013
讽刺之城俄亥俄 我是用string类型的一个变量获取到了图片的地址,现在想用string类型转换成bitmap类型,是为了使用bitmap类型进行图片的对比操作
4 年多之前 回复
Dragon_2013
讽刺之城俄亥俄 我是用string类型的一个变量获取到了图片的地址,现在想用string类型转换成bitmap类型,是为了使用bitmap
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
从数据库获取图片地址如何赋给bitmap类型的值
如题。。。。。。。。求大神指点 下面是我自己编写的几句代码 //从数据库获取图片地址 (value是string类型) var sert = db.T_GrowData.Where(e => e.dateSubmit == dateSubmit && e.status == 1).AsEnumerable().FirstOrDefault().value; //将获取到的string类型数据转换成byte[] byte[] bt = System.Text.Encoding.Default.GetBytes(sert); //再将转换成的byte[]赋值给bitmap MemoryStream ms = new MemoryStream(bt); Bitmap bm = (Bitmap)Image.FromStream(ms);//运行时此处报错:参数错误 我的这种思路是否正确?在赋值的时候报错是什么原因呢?这种问题该如何解决? 哪位大神有解决办法的还望不要吝啬告诉本小白,,,先谢谢啦
关于Base64转换成Bitmap的问题,每次转换Bitmap都是空
在网上查了一下这个方法可以把base64转换成Bitmap, public static Bitmap stringToBitmap(String string) { byte[] bytes = Base64.decode(string, Base64.DEFAULT); Bitmap bitmap=BitmapFactory.decodeByteArray(bytes, 0, bytes.length); return bitmap; } 可是我每次转换的bitmap值都是空,而我把参数string放在在线base64转图片里面是可以成功生成图片的,麻烦大家帮帮看看这个问题怎么解决?
用c# 怎么实现图片格式转换 (主要是转换成Ico格式图片)
通过:savePic.Save(FileName ,System.Drawing.Imaging.ImageFormat.Icon) 转换成共后的图片不能使用 而通过下面的方法 转换后的图片虽然可以用但是明显发生了变化 private void ZhuangHuan(string sourcePath,string desPath) { using(Bitmap bitmap=new Bitmap(sourcePath)) { using(Bitmap newBitmap=bitmap.Clone(new Rectangle(0,0,bitmap.Width,bitmap.Height),PixelFormat.Format24bppRgb)) { using(Icon icon=Icon.FromHandle(newBitmap.GetHicon())) { FileStream fileStream = new FileStream(desPath, System.IO.FileMode.Create); icon.Save(fileStream); } } } } 有没有更好的办法??
android 中怎么讲drawable无损的转换成成String啊?
在网上搜索,全都是一个样: /** * 图片转换成字符串 * * @param drawable * @return */ public String drawableToByte(Drawable drawable) { if (drawable != null) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); int size = bitmap.getWidth() * bitmap.getHeight() * 4; // 创建一个字节数组输出流,流的大小为size ByteArrayOutputStream baos = new ByteArrayOutputStream(size); // 设置位图的压缩格式,质量为100%,并放入字节数组输出流中 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); // 将字节数组输出流转化为字节数组byte[] byte[] imagedata = baos.toByteArray(); String icon = Base64.encodeToString(imagedata, Base64.DEFAULT); return icon; } return null; } 但是这样转换后图片丢失很多像素,如果反复的压缩几次的话,图片就变成马赛克,最后就不能正常显示了。 有没有好的方法将一个drawable转换成String啊?
c# image转bitmap出现这个问题怎么解决?
我想从文件中读取一张图片,然后将它转化为bitmap类型,但是显示bitmap 里面宽和高都为0,还有一个result包含读取的image信息 ![图片说明](https://img-ask.csdn.net/upload/201905/05/1557019904_941078.png) 显示的错误是不能将System.Drawing.Image转化为interaction.Bitmap,interaction是命名空间 这是代码: ``` string path = @"C:\Users\olivier\Desktop\image\1.jpg"; Image pic = Image.FromFile(path); Bitmap bit = new Bitmap(pic); ``` 小弟菜鸟一枚,求救da'xia'men ![图片说明](https://img-ask.csdn.net/upload/201905/05/1557022664_189178.png) 如果强制转换就成这样了 ![图片说明](https://img-ask.csdn.net/upload/201905/05/1557023922_596604.png)
java 用Base64压缩图片后图片怎么越来越模糊啊?
我这里服务端只储存图片的16进制字符串。所以我要先把16进制的字符串转换成String,再转换成Drawable. 同理要是传送图片到服务端,也是一样,将Drawable转换成String,在转换成16进制字符串。最近发现,我对一张图片一直进行这些操作(16->string->Drawable->string->16->......) 图片会越来越模糊,最后图片就不能显示了,这些事我转换图片和字符串的代码: /** * 16进制字符串转换成String * * @param hexStr * @return */ public String hexStr2Str(String hexStr) { if (hexStr==null) return null; String str = "0123456789ABCDEF"; char[] hexs = hexStr.toCharArray(); byte[] bytes = new byte[hexStr.length() / 2]; int n; for (int i = 0; i < bytes.length; i++) { n = str.indexOf(hexs[2 * i]) * 16; n += str.indexOf(hexs[2 * i + 1]); bytes[i] = (byte) (n & 0xff); } return new String(bytes); } /** * String转换drawable * * @param icon * @return */ public Drawable byteToDrawable(String icon) { byte[] img = null; try { img = Base64.decode(icon.getBytes(), Base64.DEFAULT); }catch (Exception e){ } Bitmap bitmap; if (img != null) { bitmap = BitmapFactory.decodeByteArray(img, 0, img.length); @SuppressWarnings("deprecation") Drawable drawable = new BitmapDrawable(bitmap); return drawable; } return null; } /** * 图片转换成字符串 * * @param drawable * @return */ public String drawableToByte(Drawable drawable) { if (drawable != null) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); int size = bitmap.getWidth() * bitmap.getHeight() * 4; // 创建一个字节数组输出流,流的大小为size ByteArrayOutputStream baos = new ByteArrayOutputStream(size); // 设置位图的压缩格式,质量为100%,并放入字节数组输出流中 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); // 将字节数组输出流转化为字节数组byte[] byte[] imagedata = baos.toByteArray(); String icon = Base64.encodeToString(imagedata, Base64.DEFAULT); return icon; } return null; } /** * 字符串转换成十六进制字符串 * * @param str * @return */ public String str2HexStr(String str) { char[] chars = "0123456789ABCDEF".toCharArray(); StringBuilder sb = new StringBuilder(""); byte[] bs = str.getBytes(); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append(chars[bit]); bit = bs[i] & 0x0f; sb.append(chars[bit]); } return sb.toString(); } 这些代码都是网上copy的,也不晓得哪里有问题。
android byte转图片的问题
```public class MainActivity extends Activity { private ImageView iv1,iv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); //获取iv1的图片并将图片转成byte Bitmap bitmap = ((BitmapDrawable)iv1.getDrawable()).getBitmap(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] byteArray = baos.toByteArray(); String sendString; try { //将byte转为String sendString = new String(byteArray , "UTF-8" ); try { //将String转回byte byte[] data = sendString.getBytes("UTF-8"); // 为UTF8编吗 // 把二进制图片转成位图 YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, 100, 100, null); // 20、20分别是图的宽度与高度 ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); // 80--JPG图片的质量[0-100],100最高 yuvimage.compressToJpeg(new Rect(0, 0, 20, 20), 80, baos2); byte[] jdata = baos2.toByteArray(); Bitmap bitmap2 = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); iv2.setImageBitmap(bitmap2); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } private void initview() { // TODO Auto-generated method stub iv1=(ImageView) findViewById(R.id.imageView1); iv2=(ImageView) findViewById(R.id.imageView2); } } ``` ``` ![图片说明](https://img-ask.csdn.net/upload/201512/07/1449466888_815004.png) 转换完成之后图片不一样,这是怎么回事,求大神解惑
如何把图像转换成base64字符串
我想把图像转换成base64 encode字符串。然后使用oma_status-icon xml格式发送到服务器。 但是我从服务器响应中获得不受支持的编码。 我是用的如下代码实现的: Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.image); ByteArrayOutputStream bao = new ByteArrayOutputStream(); bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 100, bao); byte [] ba = bao.toByteArray(); String ba1=Base64.encodeBytes(ba); 怎么把图像转换成base64字符串?
Aspose.cells 在将excel转换为图片时,未显示完全
就是在用Aspose.cells将excel转换为图片时,如果excel列数过多,生成的图片并不是所有的内容,而是一部分。求解。。。这是什么原因?还有就是excel默认3个sheet,在转图片的时候如果该sheet没有内容可以怎样判断一下?而让这个空白页不进行转换操作? ``` /// <summary> /// 将Excel文档转换为图片的方法(该方法基于第三方DLL),你可以像这样调用该方法: /// ConvertExcelImage("F:\\PdfFile.doc", "F:\\", "ImageFile", 1, 20, ImageFormat.Png, 256); /// </summary> /// <param name="pdfInputPath">Excel文件路径</param> /// <param name="imageOutputPath">图片输出路径,如果为空,默认值为Excel所在路径</param> /// <param name="imageName">图片的名字,不需要带扩展名,如果为空,默认值为Excel的名称</param> /// <param name="startPageNum">从Excel文档的第几页开始转换,如果为0,默认值为1</param> /// <param name="endPageNum">从Excel文档的第几页开始停止转换,如果为0,默认值为Excel总页数</param> /// <param name="imageFormat">设置所需图片格式,如果为null,默认格式为PNG</param> /// <param name="resolution">设置图片的像素,数字越大越清晰,如果为0,默认值为128,建议最大值不要超过1024</param> public static void ConvertExcelToImage(string excelInputPath, string imageOutputPath, string imageName, int startPageNum, int endPageNum, ImageFormat imageFormat, float resolution) { try { // open Excel file Aspose.Cells.Workbook excel = new Aspose.Cells.Workbook(excelInputPath); int cnt = excel.Worksheets.Count; Aspose.Cells.Rendering.ImageOrPrintOptions imageopt = new Aspose.Cells.Rendering.ImageOrPrintOptions(); imageopt.ImageFormat = imageFormat; imageopt.OnePagePerSheet = true; imageopt.PrintingPage = Aspose.Cells.PrintingPageType.IgnoreBlank; // validate parameter if (excel == null) { throw new Exception("Excel文件无效或者Excel文件被加密!"); } if (imageOutputPath.Trim().Length == 0) { imageOutputPath = Path.GetDirectoryName(excelInputPath); } if (!Directory.Exists(imageOutputPath)) { Directory.CreateDirectory(imageOutputPath); } if (imageName.Trim().Length == 0) { imageName = Path.GetFileNameWithoutExtension(excelInputPath); } if (startPageNum <= 0) { startPageNum = 1; } if (imageFormat == null) { imageFormat = ImageFormat.Png; } if (resolution <= 0) { resolution = 128; } ImageSaveOptions imageSaveOptions = new ImageSaveOptions(GetSaveFormat(imageFormat)); imageSaveOptions.Resolution = resolution; // start to convert each page for (int j = 0; j < cnt; j++) { Aspose.Cells.Worksheet sheet = excel.Worksheets[j]; Aspose.Cells.Rendering.SheetRender sr = new Aspose.Cells.Rendering.SheetRender(sheet, imageopt); sheet.PageSetup.BottomMargin = 0; sheet.PageSetup.RightMargin = 0; sheet.PageSetup.TopMargin = 0; sheet.PageSetup.LeftMargin = 0; if (endPageNum > sr.PageCount || endPageNum <= 0) { endPageNum = sr.PageCount; } if (startPageNum > endPageNum) { int tempPageNum = startPageNum; startPageNum = endPageNum; endPageNum = startPageNum; } //for (int i = startPageNum; i <= endPageNum; i++) //{ imageSaveOptions.PageIndex = j - 1; string strNumber; if (j < 10) { strNumber = "0" + j.ToString(); } else { strNumber = j.ToString(); } //Bitmap bit = sr.ToImage(j); //if(bit!=null) //bit.Save(Path.Combine(imageOutputPath, imageName) + "sheet" + j + "_" + strNumber + "." + imageFormat.ToString(), imageFormat); sr.ToImage(j, Path.Combine(imageOutputPath, imageName) +"sheet"+j+ "_" + strNumber + "." + imageFormat.ToString()); //doc.Save(Path.Combine(imageOutputPath, imageName) + "_" + strNumber + "." + imageFormat.ToString(), imageSaveOptions); //} } } catch (Exception ex) { throw ex; } } ``` excel: ![图片说明](https://img-ask.csdn.net/upload/201702/14/1487045054_907836.png) image: ![图片说明](https://img-ask.csdn.net/upload/201702/14/1487045077_795917.png)
解析EditText.getText().toString()得到的图片
求助各位大神:我在EditText中插入了一张图片,我用edit_text.getText().toString将图片以String形式保存,我怎么把String又转换为图片显示在TextView中呢? ``` SpannableString ss = new SpannableString(imagePath); Pattern p=Pattern.compile("/mnt/sdcard/.+?\\.\\w{3}"); Matcher m=p.matcher(imagePath); while(m.find()){ Bitmap bm = BitmapFactory.decodeFile(m.group()); Bitmap rbm = r.resizeImage(bm, 100, 100); ImageSpan span = new ImageSpan(this, rbm); ss.setSpan(span, m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } Editable edit_text = display.getEditableText(); edit_text.append(ss); ``` 这样做只能得到路径格式的字符串。怎么让图片再显示出来呢?
C#保存图片到sql server2012的image格式,再读取出来的时候总是说“参数错误”
C#读取图片文件,然后将其保存到Sql Server 2012里的一张表里,该列的数据类型为Image。 然后再读取数据库,先用内存流保存该二进制图片,然后将内存流转换成位图显示。 转换成位图的时候总是显示“参数错误”。 **选择图片** 时测试过,可以用picturebox正常显示: OpenFileDialog openDlg = new OpenFileDialog(); openDlg.Filter = "图片文件(*.jpg)|*.jpg"; string filePath = ""; if (openDlg.ShowDialog() == DialogResult.OK) { filePath = openDlg.FileName; this.label_newcharacter_picture_filepath.Text = filePath; /*-------打开文件流,用来读取图片文件中的数据------*/ FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); /*-------修改picturebox_newcharacter_picturedisplay对应的图片------*/ Bitmap bitmap1 = new Bitmap(stream); pictureBox_newcharacter_picturedisplay.Image = bitmap1; /*-------将文件流中的数据存储到内存字节组picturebuffer中------*/ picturebuffer = new byte[stream.Length]; stream.Read(picturebuffer, 0, (int)stream.Length); stream.Close(); } 此处picturebox可以正常显示图片,并且用picturebuffer存储了图片的内容。 **存储图片** SqlCommand cmd = new SqlCommand("StoredProcedure", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@chno", SqlDbType.Char).Value = textBox_newcharacter_chno.Text; cmd.Parameters.Add("@career", SqlDbType.Char).Value = textBox_newcharacter_career.Text; cmd.Parameters.Add("@skill", SqlDbType.VarChar).Value = textBox_newcharacter_skill.Text; cmd.Parameters.Add("@picture", SqlDbType.Image).Value = picturebuffer; cmd.ExecuteNonQuery(); MessageBox.Show("新建成功!"); 也能正常存储,并且打开数据库也能看到<二进制数据>字样。 再 **读取数据** con.Open(); string CharacterInfoSelect = "select * from character where chno = '" + CharacterNum + "'"; SqlDataAdapter CharacterAdapter = new SqlDataAdapter(CharacterInfoSelect, con); DataTable CharacterTabel = new DataTable(); CharacterAdapter.Fill(CharacterTabel); textBox_character_chno.Text = CharacterTabel.Rows[0][0].ToString(); textBox_character_career.Text = CharacterTabel.Rows[0][1].ToString(); textBox_character_skill.Text = CharacterTabel.Rows[0][2].ToString(); byte[] picturebuffer = (byte[])CharacterTabel.Rows[0][3]; MemoryStream stream1 = new MemoryStream(picturebuffer); stream1.Write(picturebuffer, 0, picturebuffer.Length); Image img = Image.FromStream(stream1); pictureBox_character_picturedisplay.Image = img; 设断点调试,总是在执行 Image img = Image.FromStream(stream1); 时跳到catch。 试过别的办法: string sql = "select picture from character where chno = '" + CharacterNum + "'"; SqlCommand cmm = new SqlCommand(sql, con); SqlDataReader reader = cmm.ExecuteReader(); reader.Read(); MemoryStream stream = new MemoryStream((byte[])reader[0]); pictureBox_character_picturedisplay.Image = Image.FromStream(stream); 没用。 byte[] picturebuffer = (byte[])CharacterTabel.Rows[0][3]; MemoryStream stream1 = new MemoryStream(picturebuffer); Bitmap bitmap1 = new Bitmap(picturebuffer); pictureBox_character_picturedisplay.Image = bitmap1; 这是书上最原始的代码,也行不通。 我在想是不是存入Sql server的时候,用Image格式存储会导致某种改变还是啥。别的数据都是对的,唯独读不出图片,求解。
android 上传图片成功但是显示错误(全是灰色或者是马赛克图片)
我上传图片先又bitmap转成base64代码如下: ​​​/* * 将bitmap转换为base64字节数组 */ public static String bitmapToBase64(Bitmap bitmap) { String result = ""; ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] bitmapBytes = baos.toByteArray(); result = Base64.encodeToString(bitmapBytes, Base64.NO_WRAP); // Base64Encoder encoder = new Base64Encoder(baos); // result=encoder.encode(bitmapBytes); return new String(result); } 然后将其上传: public FileUploadEntity uploadPic2(String param) throws XLException { try { String json = RequestUtils.sendPostByHttp("/com/picupload.html", "pic=" + param); Log.d("uploadPic", param); int a = param.length(); Log.d(TAG, "json:" + json); FileUploadEntity order = mGson.fromJson(json, FileUploadEntity.class); if (order != null) { return order; } else { throw new XLException(new Result(Result.DEFAULT_ERROR)); } } catch (JsonParseException e) { throw new XLException(e, new Result(Result.JSON_ERROR)); } } 这里我把post请求的代码也贴出来: /** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ public static String sendPostByHttp(String url, String param){ url = Constant.SERVER_URL + url; PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setRequestProperty("Accept-Charset", "UTF-8"); conn.setRequestProperty("contentType", "UTF-8"); conn.setReadTimeout(READ_TIME_OUT_NORMAL); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(param); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( conn.getInputStream(), "UTF-8")); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { // logger.error("发送Http的POST 请求出现异常!" + e); } // 使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } 希望哪位大神能帮忙看看,很急!​
android glide圆形图片加载一团黑
public class GlideCircleTransform extends BitmapTransformation { public GlideCircleTransform(Context context) { super(context); } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool, toTransform); } private Bitmap circleCrop(BitmapPool pool, Bitmap toTransform) { if (toTransform == null) return null; int size = Math.min(toTransform.getWidth(), toTransform.getHeight()); int x = (toTransform.getWidth() - size) / 2; int y = (toTransform.getHeight() - size) / 2; // TODO this could be acquired from the pool too Bitmap squared = Bitmap.createBitmap(toTransform, x, y, size, size); Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); return result; } @Override public String getId() { return getClass().getName(); } } 网上都是这一个方法转换成圆形 我也是这么用 Glide.with()....加载网络的几张图片 后面几张正常了 前面好几张就是一团黑 要么是一团灰![图片说明](https://img-ask.csdn.net/upload/201611/17/1479385148_726212.png)
百度地图获取经纬度没问题但是具体地址省城市街道有时能得到有时却是返回null求解救
public class PhotoFragment extends Fragment { public static final String IMAGE_UNSPECIFIED = "image/*"; private ImageView iv_head = null; private String[] strings = null; private FileOutputStream b = null; private String mImagePath = null; private File sdcardTempFile = null; private Bitmap myBitmap = null; private byte[] mContent = null; private Button btn_geog = null; // 定位相关 private String loc = null; // 保存定位信息 private LocationClient mLocationClient = null; private BDLocationListener myListener = new MyLocationListener(); private LocationMode mCurrentMode; boolean isFirstLoc = true;// 是否首次定位 private String head_str = null; private Map<String, String> upMap = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_photo, container, false); initview(); btn_geog = (Button) view.findViewById(R.id.geog); iv_head = (ImageView) view.findViewById(R.id.head); // 用于保存上传的信息时使用 upMap = new HashMap<String, String>(); sdcardTempFile = new File("/mnt/sdcard/", "tmp_pic_" + SystemClock.currentThreadTimeMillis() + ".jpg"); iv_head.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder dialog = new AlertDialog.Builder( getActivity()); dialog.setTitle("请选择"); strings = new String[2]; strings[0] = "相机"; strings[1] = "相册"; dialog.setItems(strings, new DialogInterface.OnClickListener() { // which 如果是点击列表中的选项 表示当前点击的item的下标 @Override public void onClick(DialogInterface dialog, int which) { if (which == 0) { String status = Environment .getExternalStorageState(); if (status.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); try { sdcardTempFile.createNewFile(); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(sdcardTempFile)); } catch (IOException e) { e.printStackTrace(); } startActivityForResult(intent, 100); } else { Toast.makeText(getActivity(), "请安装储存卡", Toast.LENGTH_SHORT).show(); } } else if (which == 1) { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED); try { sdcardTempFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } startActivityForResult(intent, 101); } } }); dialog.create(); dialog.show(); } }); btn_geog.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mLocationClient.start();// 开启定位SDK mLocationClient.requestLocation();// 开始请求位置 } }); return view; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 100 || data != null) { mImagePath = sdcardTempFile.getAbsolutePath(); File file = new File(mImagePath); // 这是需要上传的转换成Base64的String 他大爷的就是这里出错了 // head_str = bitmapToString(mImagePath); myBitmap = decodeFile(file); if (myBitmap != null) { iv_head.setImageBitmap(myBitmap); } } if (requestCode == 101 || null != data) { try { // ContentResolver是可以对ContentProvider操作的类 ContentResolver resolver = getActivity().getContentResolver(); Uri originalUri = data.getData();// 取数据 // 这是把输入流转成了字节数组Uri.parse需要一个路径openInputStream需要一个URI mContent = readStream(resolver.openInputStream(Uri .parse(originalUri.toString()))); BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inJustDecodeBounds = true; opt.inDither = false; opt.inPurgeable = true; opt.inSampleSize = calculateInSampleSize(opt, 480, 800); // opt.inTempStorage = new byte[12 * 1024]; opt.inJustDecodeBounds = false; // 将字节数组转换为ImageView可调用的Bitmap对象 myBitmap = getPicFromBytes(mContent, opt); iv_head.setImageBitmap(myBitmap); mImagePath = getPath(originalUri); } catch (Exception e) { System.out.print(e.getMessage()); } } } /* * 压缩图片,避免内存不足报错 */ private Bitmap decodeFile(File f) { Bitmap b = null; try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; FileInputStream fis = new FileInputStream(f); BitmapFactory.decodeStream(fis, null, o); fis.close(); BitmapFactory.Options o2 = new BitmapFactory.Options(); int width = o.outWidth; int height = o.outHeight; int test = calculateInSampleSize(o, 480, 800); Log.i("照片长宽:", " width:" + width + " height:" + height + "insamplesize:" + test); o2.inSampleSize = calculateInSampleSize(o, 480, 800); fis = new FileInputStream(f); b = BitmapFactory.decodeStream(fis, null, o2); fis.close(); } catch (IOException e) { e.printStackTrace(); } return b; } // 计算图片的缩放值 public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } public static byte[] readStream(InputStream inStream) throws Exception { byte[] buffer = new byte[1024]; int len = -1; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); outStream.close(); inStream.close(); return data; } public static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) { if (bytes != null) if (opts != null) return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); else return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); return null; } private String getPath(Uri originalUri) { String[] imgs = { MediaStore.Images.Media.DATA };// 将图片URI转换成存储路径 Cursor cursor = getActivity().managedQuery(originalUri, imgs, null, null, null); int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(index); } // 把bitmap转换成Base64 String public static String bitmapToString(String filePath) { Bitmap bm = getSmallBitmap(filePath); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 40, baos); byte[] b = baos.toByteArray(); return Base64.encodeToString(b, Base64.DEFAULT); } // 根据路径获得图片并压缩,返回bitmap用于显示 public static Bitmap getSmallBitmap(String filePath) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, 480, 800); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filePath, options); } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location != null) { StringBuffer sb = new StringBuffer(128);// 接受服务返回的缓冲区 // 上传服务器的时候可不能忘记去除\n哦 sb.append(location.getProvince() + location.getCity() + location.getStreet() + "\n" + "(北纬" + location.getLatitude() + "东经" + location.getLongitude() + ")");// 获得城市 loc = sb.toString(); Toast.makeText(getActivity(), loc, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), "无法定位", Toast.LENGTH_SHORT) .show(); return; } } @Override public void onReceivePoi(BDLocation arg0) { } } /** * 停止,减少资源消耗 */ public void stopListener() { if (mLocationClient != null && mLocationClient.isStarted()) { mLocationClient.stop();// 关闭定位SDK mLocationClient = null; } } public void initview() { mCurrentMode = LocationMode.NORMAL; mLocationClient = new LocationClient(getActivity()); // 声明LocationClient类 mLocationClient.registerLocationListener(myListener); // 注册监听函数 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开GPS option.setAddrType("all");// 返回的定位结果包含地址信息 option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02 option.disableCache(false);// 禁止启用缓存定位 option.setPoiExtraInfo(true);// 获取地址 电话等信息 option.setPriority(LocationClientOption.NetWorkFirst);// 网络定位优先 mLocationClient.setLocOption(option);// 使用设置 mLocationClient.start(); mLocationClient.requestLocation(); } @Override public void onDestroy() { stopListener();// 停止监听 super.onDestroy(); } }
itextsharp 导出pdf ,动态生成的图片问题
itextsharp 支持jquery吗 我采用下面的方法,去把当前的url转换为pdf。 ``` public void CreatPdf(string htmlurl, int lange) { Document doc = new Document(PageSize.A4, 9, 18, 36, 36);//左右上下 MemoryStream ms = new MemoryStream(); try { PdfWriter writer = PdfWriter.GetInstance(doc, ms); writer.CloseStream = false; doc.Open(); //url = HttpContext.Current.Server.MapPath("h1.html"); url = htmlurl; Thread thread = new Thread(new ThreadStart(setBitmap)); thread.SetApartmentState(ApartmentState.STA); thread.Start(); while (thread.IsAlive) Thread.Sleep(100); bitmap.Save(HttpContext.Current.Server.MapPath("t.bmp")); iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(bitmap, System.Drawing.Imaging.ImageFormat.Bmp); //img.ScalePercent(75);//560 630 if (lange == 1) { img.ScalePercent(50); } else { img.ScalePercent(48); } //img.ScaleAbsolute(w, h); doc.Add(img); } catch (Exception err) { throw new Exception(err.Message); } finally { doc.Close(); using (FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("out.pdf"), FileMode.Create)) { ms.Position = 0; byte[] bit = new byte[ms.Length]; ms.Read(bit, 0, (int)ms.Length); fs.Write(bit, 0, bit.Length); } ViewPdf(ms, "out"); } } ``` 在我本机和我们的一台windows server 2003 机子发布了下,导出没有问题。但,当发布到客户的虚拟主机上后,导出的pdf里面的图片就不对了。 这个图片是我jquery动态生成的。不知道怎么回事?希望高手指点一二。。 我本机上运行,导出的pdf: ![图片说明](https://img-ask.csdn.net/upload/201506/30/1435628727_528065.jpg) 客户虚拟主机上发布后,导出的pdf: ![图片说明](https://img-ask.csdn.net/upload/201506/30/1435628717_540045.jpg)
无法执行 ImageView imageView = new ImageView(this);
我写的瀑布流显示图片 每次执行到Log.e("error","101成功压缩图片")这句就没办法执行了,下面是我的代码 import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; public class MainActivity extends Activity implements Runnable{ private final int NUM_OF_PIC = 30; //每次请求获取的图片数量 private LinearLayout linearLayout1 = null; private LinearLayout linearLayout2 = null; private LinearLayout linearLayout3 = null; private View scrollView = null; public static int USE_LINEAR_INTERVAL = 0; public static int linearlayoutWidth; private byte[][] picBytes = new byte[NUM_OF_PIC][]; private int numOfPic = 0;//已加载的图片数量 private int index = 0; public static int requestTime = 0; private PictureArrayOfBytes picArray ; private Handler mHandler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 1: try { Log.e("error","39"); addBitmaps(); Log.e("error","41"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); linearLayout1 = (LinearLayout)findViewById(R.id.main_linearlayout1); linearLayout2 = (LinearLayout)findViewById(R.id.main_linearlayout2); linearLayout3 = (LinearLayout)findViewById(R.id.main_linearlayout3); linearlayoutWidth = (int)(getWindowManager().getDefaultDisplay().getWidth()/3); Log.e("error","creat: " + String.valueOf(linearlayoutWidth)); scrollView = findViewById(R.id.scroll); Log.e("error","61"); final Thread thread = new Thread(new MainActivity()); Log.e("error","65"); thread.start(); Log.e("error","67"); Log.e("info", "context: "+(context == null)); scrollView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN : break; case MotionEvent.ACTION_MOVE : index++; break; default : break; } if (event.getAction() == MotionEvent.ACTION_UP && index > 0) { index = 0; View view = ((ScrollView) v).getChildAt(0); if (view.getMeasuredHeight() <= v.getScrollY() + v.getHeight()) { //加载数据代码 //每次加载30张图片,一共加载5次 if (numOfPic >= NUM_OF_PIC){ numOfPic = 0; thread.start(); } } } return false; } }); Log.e("error","90"); } private void addBitmaps() throws Exception{ Log.e("error","87:开始加载图片"); for (int i = 0; i < NUM_OF_PIC; i++){ Log.e("error","将图片数据转换成bitmap"); Bitmap bitmap = BitmapFactory.decodeByteArray(picBytes[i], 0, picBytes[i].length); Log.e("error","改编图片的大小"); Bitmap bitmap2 = BitmapZoom.bitmapZoomByWidth(bitmap, 240); //压缩图片大小 Log.e("error","101成功压缩图片"); Log.e("info", "context: "+(context == null)); ImageView imageView = new ImageView(this); Log.e("error","103"); imageView.setImageBitmap(bitmap); Log.e("error","105"); //根据图片的大小,为图片挖坑 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(bitmap2.getWidth(), bitmap2.getHeight()); //将坑和图片对象联系起来 Log.e("error","109"); imageView.setLayoutParams(layoutParams); Log.e("error","111"); //按照顺序加载图片 switch (USE_LINEAR_INTERVAL) { case 0: linearLayout1.addView(imageView); numOfPic++; break; case 1: linearLayout2.addView(imageView); numOfPic++; break; case 2: linearLayout3.addView(imageView); numOfPic++; break; default: break; } USE_LINEAR_INTERVAL++; USE_LINEAR_INTERVAL= USE_LINEAR_INTERVAL%3; } } @Override public void run() { // TODO Auto-generated method stub try { requestTime++; picArray = new PictureArrayOfBytes(requestTime); picBytes = picArray.getPicByteArray(); Message message = new Message(); message.what = 1; Log.e("error","153"); mHandler.sendMessage(message); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 下面是我的logcat中的信息: 06-07 15:08:39.146: D/dalvikvm(2418): GC_CONCURRENT freed 292K, 4% free 13039K/13511K, paused 6ms+6ms 06-07 15:08:46.238: E/error(2418): 153 06-07 15:08:46.238: E/error(2418): 39 06-07 15:08:46.238: E/error(2418): 87:开始加载图片 06-07 15:08:46.238: E/error(2418): 将图片数据转换成bitmap 06-07 15:08:46.315: D/dalvikvm(2418): GC_FOR_ALLOC freed 252K, 4% free 13084K/13575K, paused 76ms 06-07 15:08:46.315: I/dalvikvm-heap(2418): Grow heap (frag case) to 12.987MB for 160016-byte allocation 06-07 15:08:46.498: D/dalvikvm(2418): GC_FOR_ALLOC freed <1K, 4% free 13240K/13767K, paused 87ms 06-07 15:08:46.498: E/error(2418): 改编图片的大小 06-07 15:08:46.566: D/dalvikvm(2418): GC_FOR_ALLOC freed 27K, 5% free 13214K/13767K, paused 66ms 06-07 15:08:46.575: I/dalvikvm-heap(2418): Grow heap (frag case) to 13.181MB for 230416-byte allocation 06-07 15:08:46.635: D/dalvikvm(2418): GC_FOR_ALLOC freed 0K, 5% free 13439K/14023K, paused 60ms **06-07 15:08:46.645: E/error(2418): 101成功压缩图片 06-07 15:08:46.655: W/System.err(2418): java.lang.NullPointerException** 06-07 15:08:46.685: W/System.err(2418):at android.content.ContextWrapper.getResources(ContextWrapper.java:81) 06-07 15:08:46.685: W/System.err(2418): at android.view.View.<init>(View.java:2696) 06-07 15:08:46.685: W/System.err(2418): at android.widget.ImageView.<init>(ImageView.java:104) 06-07 15:08:46.685: W/System.err(2418): at com.example.mywaterfallversion2.MainActivity.addBitmaps(MainActivity.java:113) 06-07 15:08:46.685: W/System.err(2418): at com.example.mywaterfallversion2.MainActivity.access$0(MainActivity.java:101) 06-07 15:08:46.698: W/System.err(2418): at com.example.mywaterfallversion2.MainActivity$1.handleMessage(MainActivity.java:39) 06-07 15:08:46.698: W/System.err(2418): at android.os.Handler.dispatchMessage(Handler.java:99) 06-07 15:08:46.698: W/System.err(2418): at android.os.Looper.loop(Looper.java:137) 06-07 15:08:46.698: W/System.err(2418): at android.app.ActivityThread.main(ActivityThread.java:4424) 06-07 15:08:46.698: W/System.err(2418): at java.lang.reflect.Method.invokeNative(Native Method) 06-07 15:08:46.706: W/System.err(2418): at java.lang.reflect.Method.invoke(Method.java:511) 06-07 15:08:46.706: W/System.err(2418): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 06-07 15:08:46.706: W/System.err(2418): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 06-07 15:08:46.706: W/System.err(2418): at dalvik.system.NativeStart.main(Native Method)
求助:透明GIF加水印后无法保持透明
各位大神好,再下做一个项目,需要加水印的功能,可发现当GIF为透明时,加水印不能保持透明。 以下是源码片段: //GIF合成 System.Drawing.Imaging.FrameDimension frameDimension = new System.Drawing.Imaging.FrameDimension(origialGif.FrameDimensionsList[0]); int frameCount = origialGif.GetFrameCount(frameDimension); for (int i = 0; i < frameCount; i++) { if (origialGif.SelectActiveFrame(frameDimension, i) == 0) { int delay = Convert.ToInt32(origialGif.GetPropertyItem(20736).Value.GetValue(i)); Image img = AddWaterPic(Image.FromHbitmap(origialGif.GetHbitmap()), waterPicturePath, alpha); Frame frame = new Frame(img, delay); frames.Add(frame); } } origialGif.Dispose(); Gif.Components.AnimatedGifEncoder gif = new Gif.Components.AnimatedGifEncoder(); gif.SetTransparent(Color.FromArgb(211, 211, 211)); gif.Start(filePath); gif.SetRepeat(0); for (int i = 0; i < frames.Count; i++) { gif.SetDelay(frames[i].Delay); gif.AddFrame(frames[i].Image); } gif.Finish(); //加水印 public static Image AddWaterPic(Bitmap origialGif, string waterPicturePath, float alpha) { //由于水印是图片,我们也需要定义一个Image来装载它 using (Image imgWatermark = new Bitmap(waterPicturePath)) { // 获取原图片的高度和宽度 int phWidth = origialGif.Width; int phHeight = origialGif.Height; // 获取水印图片的高度和宽度 int wmWidth = imgWatermark.Width; int wmHeight = imgWatermark.Height; //需要一个位图来装载水印图片。并设定其分辨率 Bitmap bmWatermark = new Bitmap(origialGif); bmWatermark.SetResolution(origialGif.HorizontalResolution, origialGif.VerticalResolution); // 继续,将水印图片装载到一个绘图画面grWatermark using (Graphics grWatermark = Graphics.FromImage(bmWatermark)) { //ImageAttributes 对象包含有关在呈现时如何操作位图和图元文件颜色的信息 ImageAttributes imageAttributes = new ImageAttributes(); #region 设置颜色 //Colormap: 定义转换颜色的映射 ColorMap colorMap = new ColorMap(); //我的水印图被定义成拥有绿色背景色的图片被替换成透明 colorMap.OldColor = Color.FromArgb(255, 0, 255, 0); colorMap.NewColor = Color.FromArgb(0, 0, 0, 0); ColorMap[] remapTable = { colorMap }; imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap); float[][] colorMatrixElements = { new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f}, // red红色 new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f}, //green绿色 new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f}, //blue蓝色 new float[] {0.0f, 0.0f, 0.0f, alpha, 0.0f},//透明度 new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}};// //ColorMatrix:定义包含 RGBA 空间坐标的 5 x 5 矩阵。 //ImageAttributes 类的若干方法通过使用颜色矩阵调整图像颜色。 ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements); imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); #endregion //上面设置完颜色,下面开始设置位置 int xPosOfWm = 0; int yPosOfWm = phHeight - wmHeight; // 第二次绘图,把水印印上去 grWatermark.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes); return bmWatermark; } } } 我在加完水印后,把每帧的图像保持下来,是透明的.但是当把这些透明的图片再次合成时,透明就会变成黑色. 在合成的循环前,循环中使用AnimatedGifEncoder.SetTransparent(Color.Black),部分帧可以变透明。(我把未能变透明的图片在PS进行采样,发现黑色是一样的黑色,但就是没有变透明)。 然后我又查了一些资料,在MSDN上写着“ Image 类不支持位图中的 Alpha 透明。 若要启用 Alpha 透明,请使用每像素 32 位的 PNG 图像。 ” 之前搜到一些转透明的文章,如“http://blog.itpub.net/12639172/viewspace-503870/”,里面提供了一些API,ToImageGif等等,可是转换都不行,要么变成白底,要么直接异常。 是这个原因吗?我用的合成是AnimatedGifEncoder类,网上也没有找到这些相关方面的资料,求大神赐教。 都是透明的图片合成以后不能透明,并且背景变成了黑色。 我全部的分数也只有21.求大神赐教了。
SurfaceView缩放、拖拽、涂鸦功能,进行坐标换算
改写了一个surfaceView,之前有缩放、拖拽功能,根据我的应用需求,我需要加上涂鸦功能, 在这个过程中,我可以再上面画矩形。画矩形没有问题,但是在画好图形进行缩放的时候,画的矩形来回抖动,不能固定,在坐标换算的时候出问题了,一直找不到问题在哪里,求高人指点。 这里坐标换算,是换算成相对于bitmap的坐标,因为bitmap是等比例缩放的,不是铺满整个surfaceview的 调用源码: ``` public MySurfaceView3 msvZoom; Bitmap bm = BitmapFactory.decodeFile(imgPath); msvZoom.setBitmap(bm); ``` 自定义SurfaceView代码 ``` import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.Rect; import android.text.TextUtils; import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import com.github.niqdev.mjpeg.OnDrawCompleteListener; import com.github.niqdev.mjpeg.bean.Data; /** * @Author hyj * @Date 2017/10/19 19:16 */ public class MySurfaceView3 extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener { private static final int NONE = 0;// 原始 private static final int DRAG = 1;// 拖动 private static final int ZOOM = 2;// 放大 private int mStatus = NONE; private static final float MAX_ZOOM_SCALE = 5f; private static final float MIN_ZOOM_SCALE = 1.0f; private static final float FLOAT_TYPE = 1.0f; private float mCurrentMaxScale = MAX_ZOOM_SCALE; private float mCurrentScale = 1.0f; private Rect mRectSrc = new Rect(); // used for render image. //要绘图的位置 private Rect mRectDes = new Rect(); // used for store size of monitor. 要画图的部分 private int mCenterX, mCenterY; int mSurfaceHeight, mSurfaceWidth, mImageHeight, mImageWidth; private PointF mStartPoint = new PointF(); private float mStartDistance = 0f; private SurfaceHolder mSurHolder = null; private Bitmap mBitmap; /********************画图部分********************/ private Paint shapePaint; private String paintColor = "FA1418";//当前画笔颜色 private int paintWidth = 3;//画笔宽度 private String action = Data.ACTION_DRAW;//画图动作 private String style = Data.STYLE_RECTANGLE;//画图形状 private float startX = 0, startY = 0, endX = 0, endY = 0;//位置比例 private float sx = 0, sy = 0, ex = 0, ey = 0; //计算出来当前屏幕中真实位置 private boolean isDrawShape = false;//当前是否处于画图状态 private ArrayMap<String, Data> amShape; private Data tempShape; private OnDrawCompleteListener<Data> onDrawCompleteListener;//标记绘制完成 /** * 还原所有画图的参数 */ private void restoreDrawParams() { startX = startY = endX = endY = 0; sx = sy = ex = ey = 0; isDrawShape = false; amShape.clear(); } /** * 获得画图状态 * * @return */ public boolean isDrawShape() { return isDrawShape; } /** * 设置画图状态 * * @param drawShape */ public void setDrawShape(boolean drawShape) { isDrawShape = drawShape; } /** * 清空所所有标记、注解 */ public void addMarker(Data dataMarker) { if (null == dataMarker || TextUtils.isEmpty(dataMarker.getAction())) { return; } switch (dataMarker.getAction()) { case Data.ACTION_DRAW: amShape.put(dataMarker.getId(), dataMarker); break; case Data.ACTION_DEL: //TODO 删除指定的图形,预留接口 break; case Data.ACTION_DELALL: restoreDrawParams(); break; } showBitmap(); } /** * 一个图形画完之后的回调事件 * * @param onDrawCompleteListener */ public void setOnDrawCompleteListener(OnDrawCompleteListener onDrawCompleteListener) { this.onDrawCompleteListener = onDrawCompleteListener; } /** * 初始化画图属性 */ private void initDrawShape() { amShape = new ArrayMap<String, Data>(); shapePaint = new Paint(); shapePaint.setAntiAlias(false); shapePaint.setStyle(Paint.Style.STROKE); shapePaint.setStrokeCap(Paint.Cap.ROUND); shapePaint.setStrokeJoin(Paint.Join.ROUND); shapePaint.setColor(Color.parseColor("#" + paintColor)); shapePaint.setStrokeWidth(paintWidth); } /** * 计算点X到图片左上角距离与图片宽度的比值 * * @param bmW 图片宽 * @param pointX 点相对于屏幕左上角的X距离 * @return */ private float pointScreen2ImageX(int bmW, float pointX) { return (pointX / mWidthScale - mRectDes.left + mRectSrc.left) * 1.0f / (bmW); } /** * 计算点Y到图片左上角与图片高度的比值 * * @param bmH 图片高度 * @param pointY 点相对于屏幕左上角的Y距离 * @return */ private float pointScreen2ImageY(int bmH, float pointY) { return (pointY / mHeightScale - mRectDes.top + mRectSrc.top) * 1.0f / (bmH); } /** * 把相对于图片的宽比值转换成相对于屏幕上具体的点 * * @param bmW 图片宽度 * @param scaleX 点的X值相对于图片宽度的比值 * @return */ private float pointImage2ScreenX(int bmW, float scaleX) { return (scaleX * bmW + mRectDes.left - mRectSrc.left) * mWidthScale; } /** * 把相对于图片的高度壁纸转换成相对于屏幕上具体的点 * * @param bmH 图片高度 * @param scaleY 点的Y值相对于图片高度的比值 * @return */ private float pointImage2ScreenY(int bmH, float scaleY) { return (scaleY * bmH + mRectDes.top - mRectSrc.top) * mHeightScale; } /********************画图部分********************/ public MySurfaceView3(Context context, AttributeSet attrs) { super(context, attrs); mSurHolder = getHolder(); mSurHolder.addCallback(this); this.setOnTouchListener(this); } private void init() { mCurrentMaxScale = Math.max(MIN_ZOOM_SCALE, 4 * Math.min(FLOAT_TYPE * mImageHeight / mSurfaceHeight, 1.0f * mImageWidth / mSurfaceWidth)); mCurrentScale = MIN_ZOOM_SCALE; mCenterX = mImageWidth / 2; mCenterY = mImageHeight / 2; initDrawShape(); calcRect(); } private void adjustCenter() { int w = mRectSrc.right - mRectSrc.left; int h = mRectSrc.bottom - mRectSrc.top; if (mCenterX - w / 2 < 0) { mCenterX = w / 2; mRectSrc.left = 0; mRectSrc.right = w; } else if (mCenterX + w / 2 >= mImageWidth) { mCenterX = mImageWidth - w / 2; mRectSrc.right = mImageWidth; mRectSrc.left = mRectSrc.right - w; } else { mRectSrc.left = mCenterX - w / 2; mRectSrc.right = mRectSrc.left + w; } if (mCenterY - h / 2 < 0) { mCenterY = h / 2; mRectSrc.top = 0; mRectSrc.bottom = h; } else if (mCenterY + h / 2 >= mImageHeight) { mCenterY = mImageHeight - h / 2; mRectSrc.bottom = mImageHeight; mRectSrc.top = mRectSrc.bottom - h; } else { mRectSrc.top = mCenterY - h / 2; mRectSrc.bottom = mRectSrc.top + h; } } private float mWidthScale = 1.0f;//当前宽的缩放比例 private float mHeightScale = 1.0f;//当前高的缩放比例 float distanceX; float distancY; private void calcRect() { int w, h; float imageRatio, surfaceRatio; imageRatio = FLOAT_TYPE * mImageWidth / mImageHeight; surfaceRatio = FLOAT_TYPE * mSurfaceWidth / mSurfaceHeight; if (imageRatio < surfaceRatio) { h = mSurfaceHeight; w = (int) (h * imageRatio); } else { w = mSurfaceWidth; h = (int) (w / imageRatio); } if (mCurrentScale > MIN_ZOOM_SCALE) { //如果显示区域超过屏幕宽高,则取屏幕宽高 w = Math.min(mSurfaceWidth, (int) (w * mCurrentScale)); h = Math.min(mSurfaceHeight, (int) (h * mCurrentScale)); } else { mCurrentScale = MIN_ZOOM_SCALE; } String msg = "imageRatio:" + imageRatio + " surfaceRatio:" + surfaceRatio + " mCurrentScale:" + mCurrentScale + " w:" + w + " h:" + h + " mSurfaceWidth:" + mSurfaceWidth + " mSurfaceHeight:" + mSurfaceHeight + " mImageWidth:" + mImageWidth + " mImageHeight:" + mImageHeight; Log.i("TAG radio", msg); mRectDes.left = (mSurfaceWidth - w) / 2; mRectDes.top = (mSurfaceHeight - h) / 2; mRectDes.right = mRectDes.left + w; mRectDes.bottom = mRectDes.top + h; float curImageRatio = FLOAT_TYPE * w / h; int h2, w2; if (curImageRatio > imageRatio) { h2 = (int) (mImageHeight / mCurrentScale); w2 = (int) (h2 * curImageRatio); } else { w2 = (int) (mImageWidth / mCurrentScale); h2 = (int) (w2 / curImageRatio); } mRectSrc.left = mCenterX - w2 / 2; mRectSrc.top = mCenterY - h2 / 2; mRectSrc.right = mRectSrc.left + w2; mRectSrc.bottom = mRectSrc.top + h2; distanceX = (mSurfaceWidth - w) / 2 - (mCenterX - w2 / 2); distancY = (mSurfaceHeight - h) / 2 - (mCenterY - h2 / 2); mWidthScale = w * FLOAT_TYPE / w2;//计算当前宽度缩放比例 mHeightScale = h * FLOAT_TYPE / h2;//计算当前高度缩放比例 } public void setMaxZoom(float value) { mCurrentMaxScale = value; } public void setBitmap(Bitmap b) { if (b == null) { return; } synchronized (MySurfaceView3.class) { mBitmap = b; if (mImageHeight != mBitmap.getHeight() || mImageWidth != mBitmap.getWidth()) { mImageHeight = mBitmap.getHeight(); mImageWidth = mBitmap.getWidth(); init(); } showBitmap(); } } private void showBitmap() { synchronized (MySurfaceView3.class) { Canvas c = getHolder().lockCanvas(); if (c != null && mBitmap != null) { c.drawColor(Color.GRAY); c.drawBitmap(mBitmap, mRectSrc, mRectDes, null); drawShape2Bitmap(c); getHolder().unlockCanvasAndPost(c); } } } private void drawShape2Bitmap(Canvas c) { if (amShape != null && amShape.size() > 0) { for (Data obj : amShape.values()) { shapePaint.setStrokeWidth(obj.getBorderWidth()); shapePaint.setColor(Color.parseColor(obj.getColor2Paint())); switch (obj.getStyle()) { case Data.STYLE_RECTANGLE: sx = pointImage2ScreenX(mImageWidth, obj.getStartPointX()); sy = pointImage2ScreenY(mImageHeight, obj.getStartPointY()); ex = pointImage2ScreenX(mImageWidth, obj.getEndPointX()); ey = pointImage2ScreenY(mImageHeight, obj.getEndPointY()); c.drawRect(sx, sy, ex, ey, shapePaint); break; case Data.STYLE_CIRCLE: //TODO 预留接口画圆 break; } } } //将图片上的点转换为屏幕上的点 if (startX != endX || startY != endY) { sx = pointImage2ScreenX(mImageWidth, startX); sy = pointImage2ScreenY(mImageHeight, startY); ex = pointImage2ScreenX(mImageWidth, endX); ey = pointImage2ScreenY(mImageHeight, endY); c.drawRect(sx, sy, ex, ey, shapePaint); String msg = "mRectSrc:" + mRectSrc.left + "," + mRectSrc.top + "," + mRectSrc.right + "," + mRectSrc.bottom; Log.i("TAG mRectSrc", msg); msg = "mRectDes:" + mRectDes.left + "," + mRectDes.top + "," + mRectDes.right + "," + mRectDes.bottom; Log.i("TAG mRectDes", msg); msg = "pintScale: " + startX + "," + startY + "," + endX + "," + endY; Log.i("TAG pintScale", msg); msg = "point:" + sx + "," + sy + "," + ex + "," + ey; Log.i("TAG point", msg); msg = "bitmap:" + mBitmap.getWidth() + "," + mBitmap.getHeight() + ",放大倍数:" + mCurrentScale + ",mWidthScale:" + mWidthScale + ",mHeightScale:" + mHeightScale; Log.i("TAG bitmap", msg); } } private void dragAction(MotionEvent event) { final int dragScale = 3;//放慢拖动速率 synchronized (MySurfaceView3.class) { PointF currentPoint = new PointF(); currentPoint.set(event.getX(), event.getY()); int offsetX = (int) (currentPoint.x - mStartPoint.x) / dragScale; int offsetY = (int) (currentPoint.y - mStartPoint.y) / dragScale; mStartPoint = currentPoint; mCenterX -= offsetX; mCenterY -= offsetY; adjustCenter(); showBitmap(); } } private void zoomAcition(MotionEvent event) { synchronized (MySurfaceView3.class) { float newDist = spacing(event); float scale = newDist / mStartDistance; mStartDistance = newDist; mCurrentScale *= scale; mCurrentScale = Math.max(FLOAT_TYPE, Math.min(mCurrentScale, mCurrentMaxScale)); calcRect(); adjustCenter(); showBitmap(); } } @Override public boolean onTouch(View v, MotionEvent event) { if (isDrawShape) { if (mRectDes.left > event.getX() || mRectDes.right < event.getX()) { return false; } else if (mRectDes.top > event.getY() || mRectDes.bottom < event.getY()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = pointScreen2ImageX(mImageWidth, event.getX()); startY = pointScreen2ImageY(mImageHeight, event.getY()); endX = startX; endY = startY; tempShape = new Data(action, style, paintColor, paintWidth); break; case MotionEvent.ACTION_MOVE: endX = pointScreen2ImageX(mImageWidth, event.getX()); endY = pointScreen2ImageY(mImageHeight, event.getY()); break; case MotionEvent.ACTION_UP: endX = pointScreen2ImageX(mImageWidth, event.getX()); endY = pointScreen2ImageY(mImageHeight, event.getY()); tempShape.setStartPoint(startX, startY); tempShape.setEndPoint(endX, endY); if (null != onDrawCompleteListener) { tempShape = onDrawCompleteListener.onDrawCoomplete(tempShape); } amShape.put(tempShape.getId(), tempShape.clone()); break; } showBitmap(); return true; } //缩放部分 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mStartPoint.set(event.getX(), event.getY()); mStatus = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: float distance = spacing(event); if (distance > 10f) { mStatus = ZOOM; mStartDistance = distance; } break; case MotionEvent.ACTION_MOVE: if (mStatus == DRAG) { dragAction(event); } else { if (event.getPointerCount() == 1) return true; zoomAcition(event); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mStatus = NONE; break; } return true; } private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return (float) Math.sqrt(x * x + y * y); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } // 初始化 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { synchronized (MySurfaceView3.class) { mRectDes.set(0, 0, width, height); mSurfaceHeight = height; mSurfaceWidth = width; init(); if (mBitmap != null) { showBitmap(); } } } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } ``` XML文件代码 ``` <MySurfaceView3 android:id="@+id/calledMsvZoom" android:layout_width="match_parent" android:layout_height="match_parent" /> ```
当向Bitmap对象加载图片时,出现奇怪内存不够问题。
我不确定从哪开始解释这个问题。 在每一行,我有一个带着一对图片按钮的列表视图。当你点击列表行,它加载一个新的控件。因为照相机布局的问题我不得不建立我新的tab。这个控件加载完成的结果是一个地图。如果我点击我的按钮来加载图片预览(从SD卡加载一个图片)应用程序从这个控件返回到列表视图控件,导致结果处理器重新加载我的新的控件,那个不过就是一个图像的小部件。 所以这就是问题,图片显示在列表视图的时候都是带着光标和列表转换器的。这使得它相当的简单,但是我不确定我怎么能够调整大小(IE下有一点小,但是不是像素的关心)图片作为图片按钮的源文件在起作用。所以我只是调整了来自于手机、相机的照片的大小。 这个问题就是当它试图返回重新加载第二个控件的时候出现了内存不足的问题。 我的问题:是否有方法让我可以逐行创建列表转换器,那样我可以调整在运行中的图片的大小(按位)?这将是合适的,因为我还需要给每一行的小工具/元素做一些属性的改变,为了我不能在触摸屏的编辑选择有焦点的一行(我可以使用滚动条)。 我知道我可以做一个不同频道信号传输来改变图片大小,并保存我的图片,但是这真的不是我想要做的,但是如果你能够给一些建议的示例代码那将是很好的。 我是这样做的 String[] from = new String[] { DBHelper.KEY_BUSINESSNAME, DBHelper.KEY_ADDRESS, DBHelper.KEY_CITY, DBHelper.KEY_GPSLONG, DBHelper.KEY_GPSLAT, DBHelper.KEY_IMAGEFILENAME + ""}; to = new int[] { R.id.businessname, R.id.address, R.id.city, R.id.gpslong, R.id.gpslat, R.id.imagefilename }; notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to); setListAdapter(notes); Where R.id.imagefilename is a ButtonImage R.id.imagefilename是一个按钮图片 这是我的日志 09-13 05:05:49.877: ERROR/dalvikvm-heap(3896): 6291456-byte external allocation too large for this process. 09-13 05:05:49.877: ERROR/(3896): VM wont let us allocate 6291456 bytes 09-13 05:05:49.877: ERROR/AndroidRuntime(3896): Uncaught handler: thread main exiting due to uncaught exception 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:304) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:149) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:174) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.drawable.Drawable.createFromPath(Drawable.java:729) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ImageView.resolveUri(ImageView.java:484) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ImageView.setImageURI(ImageView.java:281) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.SimpleCursorAdapter.setViewImage(SimpleCursorAdapter.java:183) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:129) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.CursorAdapter.getView(CursorAdapter.java:150) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.AbsListView.obtainView(AbsListView.java:1057) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ListView.makeAndAddView(ListView.java:1616) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ListView.fillSpecific(ListView.java:1177) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ListView.layoutChildren(ListView.java:1454) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.AbsListView.onLayout(AbsListView.java:937) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1108) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.onLayout(LinearLayout.java:922) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.FrameLayout.onLayout(FrameLayout.java:294) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:999) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.onLayout(LinearLayout.java:920) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.FrameLayout.onLayout(FrameLayout.java:294) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.ViewRoot.performTraversals(ViewRoot.java:771) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.ViewRoot.handleMessage(ViewRoot.java:1103) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.os.Handler.dispatchMessage(Handler.java:88) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.os.Looper.loop(Looper.java:123) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at android.app.ActivityThread.main(ActivityThread.java:3742) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at java.lang.reflect.Method.invokeNative(Native Method) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at java.lang.reflect.Method.invoke(Method.java:515) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497) 09-13 05:05:49.917: ERROR/AndroidRuntime(3896): at dalvik.system.NativeStart.main(Native Method) 09-13 05:10:01.127: ERROR/AndroidRuntime(3943): ERROR: thread attach failed 当显示一个图片的时候我又有了一个新问题 09-13 22:13:18.594: DEBUG/skia(4204): xxxxxxxxxxx jpeg error 20 Improper call to JPEG library in state %d 09-13 22:13:18.604: INFO/System.out(4204): resolveUri failed on bad bitmap uri: 09-13 22:13:18.694: ERROR/dalvikvm-heap(4204): 6291456-byte external allocation too large for this process. 09-13 22:13:18.694: ERROR/(4204): VM won't let us allocate 6291456 bytes 09-13 22:13:18.694: DEBUG/skia(4204): xxxxxxxxxxxxxxxxxxxx allocPixelRef failed
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
这30个CSS选择器,你必须熟记(上)
关注前端达人,与你共同进步CSS的魅力就是让我们前端工程师像设计师一样进行网页的设计,我们能轻而易举的改变颜色、布局、制作出漂亮的影音效果等等,我们只需要改几行代码,不需...
国产开源API网关项目进入Apache孵化器:APISIX
点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!近日,又有一个开源项目加入了这个Java开源界大名鼎鼎的Apache基金会,开始进行孵化器。项目名称:AP...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
编写Spring MVC控制器的14个技巧
本期目录 1.使用@Controller构造型 2.实现控制器接口 3.扩展AbstractController类 4.为处理程序方法指定URL映射 5.为处理程序方法指定HTTP请求方法 6.将请求参数映射到处理程序方法 7.返回模型和视图 8.将对象放入模型 9.处理程序方法中的重定向 10.处理表格提交和表格验证 11.处理文件上传 12.在控制器中自动装配业务类 ...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
求小姐姐抠图竟遭白眼?痛定思痛,我决定用 Python 自力更生!
点击蓝色“Python空间”关注我丫加个“星标”,每天一起快乐的学习大家好,我是 Rocky0429,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻...一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片:是谁!是谁把我女朋友的照片放出来的!awsl!太好看了叭...等等,那个背景上的一堆鬼画符是什么鬼?!真是看不下去!叔叔婶婶能忍,隔壁老王的三姨妈的四表...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问