精华内容
下载资源
问答
  • 图片添加文字标签图片贴图并返回标签坐标信息,颜色 文字内容等,主要提供一种场景,具体项目仍需单独做修改,大概思路可参考
  • raphael实现双击实现动态编辑文字

    热门讨论 2013-11-23 20:11:41
    在使用raphael时,实现了双击所化的文字即可实现在线编辑的功能
  • 在HTML5和CSS3标准出来之前,文字的背景只能是纯色,更不用说是自定义背景图片了。然而,强大的HTML5不仅让文字背景支持渐变颜色,而且支持自定义的背景图片,这些图片就像遮罩层,让文字的背景变得丰富多彩。
  • 仿美图秀秀可拖动功能,非常好的demo,文字动态编辑,输入框与文字同步显示。
  • 1、新建工程,选择MFC对话框,在主窗口中添加按钮,按一下按钮跳出一个静态文字。 2、给按钮添加事件,先定义两个变量。事件内容内添加如下内容 void CMFCApplication2Dlg::OnBnClickedButton1()//按键按...

    1、新建工程,选择MFC对话框,在主窗口中添加按钮,按一下按钮跳出一个静态文字。

    2、给按钮添加事件,先定义两个变量。事件内容内添加如下内容

    void CMFCApplication2Dlg::OnBnClickedButton1()//按键按下响应的消息
    {
        // TODO: 在此添加控件通知处理程序代码
        CRect tabRect;   // 标签控件客户区的位置和大小   
        this->GetClientRect(&tabRect);//获取目前窗口的大小
        if (tabRect.right < x)x = 0;//xy表示窗口左上角的点,如果超出范围就重新从左或上开始
        if (tabRect.bottom < y)y = 0;
        CStatic *pEdit;//定义一个静态文本框实例
        CRect rct(x, y, x+150, y+50);//文本框大小
        pEdit = new CStatic();//动态创建申请内存
        pEdit->Create(L"动态对话框", WS_CHILD | WS_VISIBLE, rct, this,8888 );//动态创建
        pEdit->ShowWindow(SW_SHOW);//显示在屏幕上
        x += 200; y += 100;//改变下次显示的位置
    }

    3、在此基础上修改为显示可编辑对话框

    void CMFCApplication2Dlg::OnBnClickedButton1()
    {
        // TODO: 在此添加控件通知处理程序代码
        CRect tabRect;   // 
        this->GetClientRect(&tabRect);
        if (tabRect.right < x)x = 0;
        if (tabRect.bottom < y)y = 0;
        CEdit *pEdit;//CStatic 改为了CEdit
        CRect rct(x, y, x+150, y+50);
        pEdit = new CEdit();//CStatic 改为了CEdit
        pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, rct, this, 8888);//参数改了一下
        pEdit->ShowWindow(SW_SHOW);
        x += 200; y += 100;
    }

     

    展开全文
  • GDI 打印 水印 图形 文字 图片动态添加文字
  •  1.0 :在图片上增加文字,是图片编辑中非常常见的需求。  1.1 :无demo说话不硬气,上github地址:https://github.com/horisea/PictureWhitening   欢迎star,你的星星是我持续创作的动力 二:上一下效果...

    一:前言

     1.0  :在图片上增加文字,是图片编辑中非常常见的需求。
     1.1 :无demo说话不硬气,上github地址:https://github.com/horisea/PictureWhitening    
               欢迎star,你的星星是我持续创作的动力

    二:上一下效果图

    下面我们看一下功能: 1.首先文字的颜色是可以换的;
                                       2.文字的大小是可以控制的
                                       3.给定宽度,文字的高度是动态计算的 
                                       4.文字的高度不会超出图片等等。

    三:上方法声明
     
    /**
     图片合成文字
     @param text            文字
     @param fontSize        字体大小
     @param textColor       字体颜色
     @param textFrame       字体位置
     @param image           原始图片
     @param viewFrame       图片所在View的位置
     @return UIImage *
     */
    + (UIImage *)imageWithText:(NSString *)text
                      textFont:(NSInteger)fontSize
                     textColor:(UIColor *)textColor
                     textFrame:(CGRect)textFrame
                   originImage:(UIImage *)image
        imageLocationViewFrame:(CGRect)viewFrame;
    参数确实多了一点,但是为了更加智能,好用。。我发现一个参数也不能去掉。 

    四:方法实现
    + (UIImage *)imageWithText:(NSString *)text
                      textFont:(NSInteger)fontSize
                     textColor:(UIColor *)textColor
                     textFrame:(CGRect)textFrame
                   originImage:(UIImage *)image
        imageLocationViewFrame:(CGRect)viewFrame {
        
        if (!text)      {  return image;   }
        if (!fontSize)  {  fontSize = 17;   }
        if (!textColor) {  textColor = [UIColor blackColor];   }
        if (!image)     {  return nil;  }
        if (viewFrame.size.height==0 || viewFrame.size.width==0 || textFrame.size.width==0 || textFrame.size.height==0 ){return nil;}
    
        NSString *mark = text;
        CGFloat height = [mark sizeWithPreferWidth:textFrame.size.width font:[UIFont systemFontOfSize:fontSize]].height; // 此分类方法要导入头文件
        if ((height + textFrame.origin.y) > viewFrame.size.height) { // 文字高度超出父视图的宽度
            height = viewFrame.size.height - textFrame.origin.y;
        }
        
    //    CGFloat w = image.size.width;
    //    CGFloat h = image.size.height;
        UIGraphicsBeginImageContext(viewFrame.size);
        [image drawInRect:CGRectMake(0, 0, viewFrame.size.width, viewFrame.size.height)];
        NSDictionary *attr = @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize], NSForegroundColorAttributeName : textColor };
        //位置显示
        [mark drawInRect:CGRectMake(textFrame.origin.x, textFrame.origin.y, textFrame.size.width, height) withAttributes:attr];
        
        UIImage *aimg = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return aimg;
    }

    最后:github地址里还附带了,图片美白,变灰,旋转,图片合成等方法。。欢迎star啊

    如果你喜欢这篇文章,或者有任何疑问,可以扫描第一个二维码,加楼主好友哦

    也可以扫第二个二维码,关注楼主个人微信公众号。这里有很多生活,职业,技术相关的文章哦。欢迎您的到来。

    微信号:                                             公众号


    展开全文
  • 怎么在GIF动态图中添加文字

    千次阅读 2019-10-22 16:00:35
    在我们的生活中很多地方都可以看到它的身影,而用的最多的地方就是微信和QQ等一些社交软件,人们在聊天的时候总喜欢用GIF动态图来表达自己的意思,这些动态图片中除了几张不同的图片以外,有些好带有一些字幕,可以...

    GIF动态图片其实就是多张不同的图片放在一起无限循环播放,在我们的生活中很多地方都可以看到它的身影,而用的最多的地方就是微信和QQ等一些社交软件,人们在聊天的时候总喜欢用GIF动态图来表达自己的意思,这些动态图片中除了几张不同的图片以外,有些好带有一些字幕,可以表达的更清楚。但是如果要在这些GIF动图上添加自己想要的文字该怎么做呢,这里我就教你们一个简单的方法。

    1、首先要在电脑上打开这个制作GIF的工具。

    在这里插入图片描述

    2、打开之后会进入到一个选择界面,里面有启动屏幕录制和启动GIF编辑器两个功能选项。这里我们直接选择后面一个GIF编辑器。

    在这里插入图片描述

    3、启动之后回来到一个编辑界面,但在编辑之前要先将要添加文字的GIF导入到这个界面中。点击左上角的“添加文件”即可在电脑文件中选择GIF进行导入。

    在这里插入图片描述

    4、GIF导入完成后会出现在编辑界面面的中间部分,在下方还可以看到它的帧数。你可以这个GIF进行预览,来确定要添加文字的帧。

    在这里插入图片描述

    5、确定好帧之后就可以开始添加文字的操作了,先点击一下页面上方插入工具栏中的“文字”按钮,在出现的输入框中输入要添加的文字,再将GIF图中的文字移动到合适的位置。然后点击“应用”。

    在这里插入图片描述

    6、这样文字就添加完成了,剩下的就是导出了,在页面右上角有个“导出GIF”,点击一下就可选择文件保存的位置进行导出和保存。

    在这里插入图片描述

    以上就是在电脑上给GIF动态图添加文字的方法和操作了,如果你觉得这个方法还不错的话,不妨去试一试这个方法。

    展开全文
  • 当选中网页中文字,出现一个按钮,当点击按钮后,弹出一个编辑框,里面自动加载选中文字,并且可以修改,可以提交给数据库,面向客户的
  • android的EditText里文字图片混合编辑与显示

    千次阅读 多人点赞 2018-02-23 19:33:57
    首先放一张效果(我插入的图片侵删): 插入图片我参考了这篇博客:使用Html在EditText中任意位置插入图片并正确显示 这位博主将插入讲的很好了,不过并没有讲怎么显示啊,对于我等刚刚...

    完整项目Github链接,欢迎大家下载:FLAGS

    更新一下:android 7.0以上版本的系统使用以下代码会出现无法获取path的问题,这是android系统更新后一些接口变动的原因,请直接去github上下载最新版的代码,上面已经进行了修改。

    android的EditText其实很强大,它是可以显示一部分Html格式的,而下面则介绍如何使用EditText进行文字和图片的混合编写与显示。
    首先放一张效果图(我插入的图片侵删):
    这里写图片描述

    插入图片我参考了这篇博客:使用Html在EditText中任意位置插入图片并正确显示
    这位博主将插入讲的很好了,不过并没有讲怎么显示啊,对于我等刚刚使用的小白来说完全是一脸懵逼,不过她的源码里倒是有显示的内容,花了我三个积分,我顺便优化了下,不然有的大图显示不了,会报异常:Bitmap too large to be uploaded into a texture (2340x4160, max=4096x4096)

    好了废话不多说,直接入正题:

    首先说明一下,我的这个editText的对象是content,点击插入图片的按钮触发callGallery()方法

    //region 调用图库
        private void callGallery(){
            Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
            getAlbum.setType("image/*");
            startActivityForResult(getAlbum,IMAGE_CODE);
        }
        //endregion
    
    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            //参考网址:http://blog.csdn.net/abc__d/article/details/51790806
    
            Bitmap bm = null;
            // 外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
            ContentResolver resolver = getContentResolver();
            if(requestCode == IMAGE_CODE){
                try{
                    // 获得图片的uri
                    Uri originalUri = data.getData();
                    bm = MediaStore.Images.Media.getBitmap(resolver,originalUri);
                    String[] proj = {MediaStore.Images.Media.DATA};
                    // 好像是android多媒体数据库的封装接口,具体的看Android文档
                    Cursor cursor = managedQuery(originalUri,proj,null,null,null);
                    // 按我个人理解 这个是获得用户选择的图片的索引值
                    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    // 将光标移至开头 ,这个很重要,不小心很容易引起越界
                    cursor.moveToFirst();
                    // 最后根据索引值获取图片路径
                    String path = cursor.getString(column_index);
                    insertImg(path);
                    //Toast.makeText(AddFlagActivity.this,path,Toast.LENGTH_SHORT).show();
                }catch (Exception e){
                    e.printStackTrace();
                    Toast.makeText(AddFlagActivity.this,"图片插入失败",Toast.LENGTH_SHORT).show();
                }
            }
        }
    

    可以看到,onActivityResult()的作用就是接收到从图库中选择到的图片,然后获取到它在手机中的储存地址,将地址保存到path中,然后调用insertImg(path)方法,将图片插入到EditText

    下面就是插入的函数:

     //region 插入图片
        private void insertImg(String path){
            String tagPath = "<img src=\""+path+"\"/>";//为图片路径加上<img>标签
            Bitmap bitmap = BitmapFactory.decodeFile(path);
            if(bitmap != null){
                SpannableString ss = getBitmapMime(path,tagPath);
                insertPhotoToEditText(ss);
                content.append("\n");
                Log.d("YYPT", content.getText().toString());
            }
        }
        //endregion
    
        //region 将图片插入到EditText中
        private void insertPhotoToEditText(SpannableString ss){
            Editable et = content.getText();
            int start = content.getSelectionStart();
            et.insert(start,ss);
            content.setText(et);
            content.setSelection(start+ss.length());
            content.setFocusableInTouchMode(true);
            content.setFocusable(true);
        }
        //endregion
    
        private SpannableString getBitmapMime(String path,String tagPath) {
            SpannableString ss = new SpannableString(tagPath);//这里使用加了<img>标签的图片路径
    
            int width = ScreenUtils.getScreenWidth(AddFlagActivity.this);
            int height = ScreenUtils.getScreenHeight(AddFlagActivity.this);
    
    
            Bitmap bitmap = ImageUtils.getSmallBitmap(path,width,480);
            ImageSpan imageSpan = new ImageSpan(this, bitmap);
            ss.setSpan(imageSpan, 0, tagPath.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            return ss;
        }
    

    ScreenUtils和ImageUtils的代码分别如下(是从github别人代码里直接扒拉下来的,链接在这:XRichText ,本想直接用这个富文本编辑器,但是用他的方法出问题了,干脆自己写):

    ScreenUtils:

    package com.yinyoupoet.flags;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Rect;
    import android.util.DisplayMetrics;
    import android.view.View;
    import android.view.WindowManager;
    
    /**
     * Created by sendtion on 2016/5/25.
     */
    public class ScreenUtils {
    
        /**
         * 获得屏幕宽度
         * @param context
         * @return
         */
        public static int getScreenWidth(Context context)
        {
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            return outMetrics.widthPixels;
        }
    
        /**
         * 获得屏幕高度
         * @param context
         * @return
         */
        public static int getScreenHeight(Context context) {
            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            return outMetrics.heightPixels;
        }
    
        /**
         * 获得状态栏高度
         * @param context
         * @return
         */
        public static int getStatusHeight(Context context) {
            int statusHeight = -1;
            try {
                Class<?> clazz = Class.forName("com.android.internal.R$dimen");
                Object object = clazz.newInstance();
                int height = Integer.parseInt(clazz.getField("status_bar_height")
                        .get(object).toString());
                statusHeight = context.getResources().getDimensionPixelSize(height);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return statusHeight;
        }
    
        /**
         * 获取当前屏幕截图,包含状态栏
         */
        public static Bitmap snapShotWithStatusBar(Activity activity){
            View view = activity.getWindow().getDecorView();
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache();
            Bitmap bmp = view.getDrawingCache();
            int width = getScreenWidth(activity);
            int height = getScreenHeight(activity);
            Bitmap bp = null;
            bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
            view.destroyDrawingCache();
            return bp;
        }
    
        /**
         * 获取当前屏幕截图,不包含状态栏
         *
         */
        public static Bitmap snapShotWithoutStatusBar(Activity activity){
            View view = activity.getWindow().getDecorView();
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache();
            Bitmap bmp = view.getDrawingCache();
            Rect frame = new Rect();
            activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
            int statusBarHeight = frame.top;
            int width = getScreenWidth(activity);
            int height = getScreenHeight(activity);
            Bitmap bp = null;
            bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height
                    - statusBarHeight);
            view.destroyDrawingCache();
            return bp;
        }
    }
    
    

    ImageUtils:

    package com.yinyoupoet.flags;
    
    import android.content.ContentResolver;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Matrix;
    import android.net.Uri;
    import android.util.Base64;
    import android.util.Log;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.InputStream;
    
    /**
     * Created by sendtion on 2016/5/25.
     */
    public class ImageUtils {
    
        /**
         * 图片压缩处理,size参数为压缩比,比如size为2,则压缩为1/4
         **/
        public static Bitmap compressBitmap(String path, byte[] data, Context context, Uri uri, int size, boolean width) {
            BitmapFactory.Options options = null;
            if (size > 0) {
                BitmapFactory.Options info = new BitmapFactory.Options();
                /**如果设置true的时候,decode时候Bitmap返回的为数据将空*/
                info.inJustDecodeBounds = false;
                decodeBitmap(path, data, context, uri, info);
                int dim = info.outWidth;
                if (!width) dim = Math.max(dim, info.outHeight);
                options = new BitmapFactory.Options();
                /**把图片宽高读取放在Options里*/
                options.inSampleSize = size;
            }
            Bitmap bm = null;
            try {
                bm = decodeBitmap(path, data, context, uri, options);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return bm;
        }
    
    
        /**
         * 把byte数据解析成图片
         */
        private static Bitmap decodeBitmap(String path, byte[] data, Context context, Uri uri, BitmapFactory.Options options) {
            Bitmap result = null;
            if (path != null) {
                result = BitmapFactory.decodeFile(path, options);
            } else if (data != null) {
                result = BitmapFactory.decodeByteArray(data, 0, data.length, options);
            } else if (uri != null) {
                ContentResolver cr = context.getContentResolver();
                InputStream inputStream = null;
                try {
                    inputStream = cr.openInputStream(uri);
                    result = BitmapFactory.decodeStream(inputStream, null, options);
                    inputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    
    
        /**
         * 把bitmap转换成String
         *
         * @param filePath
         * @return
         */
        public static String bitmapToString(String filePath) {
    
            Bitmap bm = getSmallBitmap(filePath, 480, 800);
    
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.JPEG, 40, baos);
            byte[] b = baos.toByteArray();
    
            return Base64.encodeToString(b, Base64.DEFAULT);
    
        }
    
        /**
         * 计算图片的缩放值
         *
         * @param options
         * @param reqWidth
         * @param reqHeight
         * @return
         */
        public static int calculateInSampleSize(BitmapFactory.Options options,
                                                int reqWidth, int reqHeight) {
            // Raw height and width of image
            final int height = options.outHeight;
            final int width = options.outWidth;
            int inSampleSize = 1;
    
            if (height > reqHeight || width > reqWidth) {
    
                // Calculate ratios of height and width to requested height and
                // width
                final int heightRatio = Math.round((float) height / (float) reqHeight);
                final int widthRatio = Math.round((float) width / (float) reqWidth);
    
                // Choose the smallest ratio as inSampleSize value, this will
                // guarantee
                // a final image with both dimensions larger than or equal to the
                // requested height and width.
                inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
            }
    
            return inSampleSize;
        }
    
        /**
         * 根据路径获得突破并压缩返回bitmap用于显示
         *
         * @return
         */
        public static Bitmap getSmallBitmap(String filePath, int newWidth, int newHeight) {
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(filePath, options);
    
            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, newWidth, newHeight);
    
            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;
    
            Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
            Bitmap newBitmap = compressImage(bitmap, 500);
            if (bitmap != null){
                bitmap.recycle();
            }
            return newBitmap;
        }
    
        /**
         * 根据view的宽度,动态缩放bitmap尺寸
         *
         * @param width
         *            view的宽度
         */
    //    public Bitmap getScaledBitmap(String filePath, int width) {
    //        BitmapFactory.Options options = new BitmapFactory.Options();
    //        options.inJustDecodeBounds = true;
    //        BitmapFactory.decodeFile(filePath, options);
    //        int sampleSize = options.outWidth > width ? options.outWidth / width
    //                + 1 : 1;
    //        options.inJustDecodeBounds = false;
    //        options.inSampleSize = sampleSize;
    //        return BitmapFactory.decodeFile(filePath, options);
    //    }
    
        /**
         * 对图片进行按比例设置
         * @param bitmap 要处理的图片
         * @return 返回处理好的图片
         */
    //    public static Bitmap getScaleBitmap(Bitmap bitmap, float widthScale, float heightScale){
    //        Matrix matrix = new Matrix();
    //        matrix.postScale(widthScale, heightScale);
    //        if(bitmap == null){
    //            return null;
    //        }
    //        Bitmap resizeBmp  =
    //                Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    //        return resizeBmp;
    //    }
    
        /**
         * 根据路径删除图片
         *
         * @param path
         */
        public static void deleteTempFile(String path) {
            File file = new File(path);
            if (file.exists()) {
                file.delete();
            }
        }
    
        /**
         * 添加到图库
         */
        public static void galleryAddPic(Context context, String path) {
            Intent mediaScanIntent = new Intent(
                    Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            File f = new File(path);
            Uri contentUri = Uri.fromFile(f);
            mediaScanIntent.setData(contentUri);
            context.sendBroadcast(mediaScanIntent);
        }
    
        //使用Bitmap加Matrix来缩放
        public static Bitmap resizeImage(Bitmap bitmapOrg, int newWidth, int newHeight)
        {
    //        Bitmap bitmapOrg = BitmapFactory.decodeFile(imagePath);
            // 获取这个图片的宽和高
            int width = bitmapOrg.getWidth();
            int height = bitmapOrg.getHeight();
            //如果宽度为0 保持原图
            if(newWidth == 0){
                newWidth = width;
                newHeight = height;
            }
            // 创建操作图片用的matrix对象
            Matrix matrix = new Matrix();
            // 计算宽高缩放率
            float scaleWidth = newWidth / width;
            float scaleHeight = newHeight / height;
            // 缩放图片动作
            matrix.postScale(scaleWidth, scaleHeight);
            Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, newWidth,
                    newHeight, matrix, true);
            //Log.e("###newWidth=", resizedBitmap.getWidth()+"");
            //Log.e("###newHeight=", resizedBitmap.getHeight()+"");
            resizedBitmap = compressImage(resizedBitmap, 100);//质量压缩
            return resizedBitmap;
        }
    
        //使用BitmapFactory.Options的inSampleSize参数来缩放
        public static Bitmap resizeImage2(String path, int width,int height)
        {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;//不加载bitmap到内存中
            BitmapFactory.decodeFile(path,options);
            int outWidth = options.outWidth;
            int outHeight = options.outHeight;
            options.inDither = false;
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            options.inSampleSize = 1;
    
            if (outWidth != 0 && outHeight != 0 && width != 0 && height != 0)
            {
                int sampleSize=(outWidth/width+outHeight/height)/2;
                Log.d("###", "sampleSize = " + sampleSize);
                options.inSampleSize = sampleSize;
            }
    
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeFile(path, options);
        }
    
        /**
         * 通过像素压缩图片,将修改图片宽高,适合获得缩略图,Used to get thumbnail
         * @param srcPath
         * @return
         */
        public static Bitmap compressBitmapByPath(String srcPath, float pixelW, float pixelH) {
            BitmapFactory.Options newOpts = new BitmapFactory.Options();
            //开始读入图片,此时把options.inJustDecodeBounds 设回true了
            newOpts.inJustDecodeBounds = true;
            newOpts.inPreferredConfig = Bitmap.Config.RGB_565;
            Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
    
            newOpts.inJustDecodeBounds = false;
            int w = newOpts.outWidth;
            int h = newOpts.outHeight;
            //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
            float hh = pixelH;//这里设置高度为800f
            float ww = pixelW;//这里设置宽度为480f
            //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
            int be = 1;//be=1表示不缩放
            if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
                be = (int) (newOpts.outWidth / ww);
            } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
                be = (int) (newOpts.outHeight / hh);
            }
            if (be <= 0)
                be = 1;
            newOpts.inSampleSize = be;//设置缩放比例
            //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
            bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
            //        return compress(bitmap, maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除
            return bitmap;
        }
    
        /**
         * 通过大小压缩,将修改图片宽高,适合获得缩略图,Used to get thumbnail
         * @param image
         * @param pixelW
         * @param pixelH
         * @return
         */
        public static Bitmap compressBitmapByBmp(Bitmap image, float pixelW, float pixelH) {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            image.compress(Bitmap.CompressFormat.JPEG, 100, os);
            if( os.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
                os.reset();//重置baos即清空baos
                image.compress(Bitmap.CompressFormat.JPEG, 50, os);//这里压缩50%,把压缩后的数据存放到baos中
            }
            ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
            BitmapFactory.Options newOpts = new BitmapFactory.Options();
            //开始读入图片,此时把options.inJustDecodeBounds 设回true了
            newOpts.inJustDecodeBounds = true;
            newOpts.inPreferredConfig = Bitmap.Config.RGB_565;
            Bitmap bitmap = BitmapFactory.decodeStream(is, null, newOpts);
            newOpts.inJustDecodeBounds = false;
            int w = newOpts.outWidth;
            int h = newOpts.outHeight;
            float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了
            float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了
            //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
            int be = 1;//be=1表示不缩放
            if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
                be = (int) (newOpts.outWidth / ww);
            } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
                be = (int) (newOpts.outHeight / hh);
            }
            if (be <= 0) be = 1;
            newOpts.inSampleSize = be;//设置缩放比例
            //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
            is = new ByteArrayInputStream(os.toByteArray());
            bitmap = BitmapFactory.decodeStream(is, null, newOpts);
            int desWidth = (int) (w / be);
            int desHeight = (int) (h / be);
            bitmap = Bitmap.createScaledBitmap(bitmap, desWidth, desHeight, true);
            //压缩好比例大小后再进行质量压缩
    //      return compress(bitmap, maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除
            return bitmap;
        }
    
        /**
         * 质量压缩
         * @param image
         * @param maxSize
         */
        public static Bitmap compressImage(Bitmap image, int maxSize){
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            // scale
            int options = 80;
            // Store the bitmap into output stream(no compress)
            image.compress(Bitmap.CompressFormat.JPEG, options, os);
            // Compress by loop
            while ( os.toByteArray().length / 1024 > maxSize) {
                // Clean up os
                os.reset();
                // interval 10
                options -= 10;
                image.compress(Bitmap.CompressFormat.JPEG, options, os);
            }
    
            Bitmap bitmap = null;
            byte[] b = os.toByteArray();
            if (b.length != 0) {
                bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
            }
            return bitmap;
        }
    
    
        /**
         * 对图片进行缩放
         * @param bgimage
         * @param newWidth
         * @param newHeight
         * @return
         */
        public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) {
    //        //使用方式
    //        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.default_img);
    //        int paddingLeft = getPaddingLeft();
    //        int paddingRight = getPaddingRight();
    //        int bmWidth = bitmap.getWidth();//图片高度
    //        int bmHeight = bitmap.getHeight();//图片宽度
    //        int zoomWidth = getWidth() - (paddingLeft + paddingRight);
    //        int zoomHeight = (int) (((float)zoomWidth / (float)bmWidth) * bmHeight);
    //        Bitmap newBitmap = zoomImage(bitmap, zoomWidth,zoomHeight);
            // 获取这个图片的宽和高
            float width = bgimage.getWidth();
            float height = bgimage.getHeight();
            //如果宽度为0 保持原图
            if(newWidth == 0){
                newWidth = width;
                newHeight = height;
            }
            // 创建操作图片用的matrix对象
            Matrix matrix = new Matrix();
            // 计算宽高缩放率
            float scaleWidth = ((float) newWidth) / width;
            float scaleHeight = ((float) newHeight) / height;
            // 缩放图片动作
            matrix.postScale(scaleWidth, scaleHeight);
            Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
                    (int) height, matrix, true);
            bitmap = compressImage(bitmap, 100);//质量压缩
            return bitmap;
        }
    
    }
    
    

    至此,我们已经可以正确插入图片了,而且我们的内容大致如下:

    今天我要胖十斤<img src="/storage/emulated/0/DCIM/Camera/IMG_20180219_144206.jpg"/>
    

    但是如果用这一段拿去显示呢?结果就是直接将上面那一段原原本本显示出来,并没有图片显示出来。那么如何加载图片呢?

    代码如下,注释掉的是因为这个方法会因为图片过大而显示不出来,所以采用下面那个没有注册的方式:

    Html.ImageGetter imageGetter = new Html.ImageGetter(){
                @Override
                public Drawable getDrawable(String s) {
                  /*  Drawable drawable = null;
                    drawable = Drawable.createFromPath(s);
    
                    drawable.setBounds(0,0,480,480);
                    return drawable;*/
                    int width = ScreenUtils.getScreenWidth(AddFlagActivity.this);
                    int height = ScreenUtils.getScreenHeight(AddFlagActivity.this);
                    Bitmap bitmap = ImageUtils.getSmallBitmap(s,width,480);
                    Drawable drawable = new BitmapDrawable(bitmap);
                    drawable.setBounds(0,0,width,height);
                    return drawable;
                }
            };
    

    再之后就可以直接显示了,代码如下:

    content.setText(Html.fromHtml("要显示的字符串", imageGetter,null));
    

    修改x1:上面的做法用于图文混合的编辑与显示是完全正确的,在编辑的时候使用了SpannableStringImageSpan这两个东西,而在显示的时候使用了ImageGetter,但是上述做法只限于编辑一次后,以后只能看,不能改,否则就会出错。
    错误在于,当使用ImageGetter将字符串以Html形式解析出图片并加载到EditText中以后,再从EditText.getText().toString()获取到的字符串,图片部分将无法解析,即不能再次恢复到<img src="xxxx" /> 这个形式,输出的具体表现形式为一个虚线框住的OBJ 。这东西不能当做string保存,因此,捣鼓半天后的解决办法,见这篇博客:EditText利用SpannableString和ImageSpan将字符串解析成图文混合形式

    完整项目Github链接,欢迎大家下载:FLAGS
    这里写图片描述



    欢迎大家加入QQ群一起交流讨论, 「吟游」程序人生——YinyouPoet
    展开全文
  • AndroidImageEditor 对于编辑图像,供应贴纸过滤器旋转作物textstciker涂鸦 版本记录 下一版本 mosaic马赛克打码功能(对抗人类...动态效果 使用方法:见DEMO示例 用法:请参见演示项目 执照 MIT是根据的开源软件。
  • 1、默认下拉菜单控件可编辑选中的内容 2、设置不可编辑后,控件会有一个...3、设置不可编辑后,下拉控件动态添加的值,会显示空白的情况 此源码就是解决以上问题 1、简单几行代码,即可设置下拉控件的背景和文字颜色
  • 因为懒,我总是在想,图片能够自动随机网上选择该多好,能不能直接将文字写在图片上,能不能一键分享到朋友圈,再配上二维码,那感觉,妙。。。 花半天时间找了一下,目标就它了:微信的「图片编辑器」,然后自...
  • 最近在网上碰到一个人问了我一个问题,在可编辑div中插入文字或者图片。因为web在线编辑器我从来只是用,基本不会去研究源代码。后来正好一个在线聊天web项目中也要用到这个功能,我就特地看看了代码。 基本上编辑...
  • vue前台实现编辑文字内容

    千次阅读 2020-03-30 18:01:35
    文本域高度随内容自动变化,不会出现滚动条,可以有多种方法,除了用js动态设置它的高度值以外还有其它更简单的方法 推荐 div标签模拟textarea,将div的contenteditable属性设置成true,使内容可编辑,达到高度随...
  • jQuery动态添加删除编辑标签代码是一款自定义选项卡,添加选项卡,删除选项卡,编辑选项卡内容等。 jQuery动态添加删除编辑标签代码截图
  • MFC动态改变编辑框里的文字颜色

    千次阅读 2013-02-27 15:26:12
    重载 HBRUSH C人脸比对Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  {  if(pWnd->GetDlgCtrlID()==IDC_STATIC1)  { ... pDC->SetTextColor(RGB(255,0,0));... if(pWnd->GetDlgCtrlID()==IDC_STA
  • 添加文本是名编辑电子杂志大师的一个基本功能,除了添加纯文本文字,我们还可以添加各种动态文本,还可以自定义文本的效果,如设置文本的背景颜色、透明度、倒影等等。 按照如下步骤,我们就可以在名编辑翻页电子...
  • 下面的页面右击pdf文件,选择编辑操作如果pdf模板没有创建打开的页面和直接打开图片文件是一样的。 ① 点击准备表单 ② 点击开始,其实上两步也可以不这么操作,不过感觉这么方便,点击开始那儿也可以选择文件,下面...
  • 大神求赐教,现在我要做一个图片动态输入文字的效果,就是点击图片的某一个位置显示一个文本输入框editText,然后在文本输入框里面输入文字,而且输入的文字可以改变字体的大小和颜色,点击确定将文字显示在图片上...
  • 该例子里有3个demo 主要讲如何用raphael实现拖动矩形或其他元素 同时可以拖动矩形的右下角对矩形进行放大或缩小 其原理是在大矩形的右下角画一个小矩形 当拖动小矩形时改变大矩形的宽度和高度 同时对小矩形予以重新...
  • ueditor富文本编辑器默认支持百度地图组件,但是如果导入动态地图后会加很多默认的地图组件在上面。如果需要自定义动态地图的组件则需要修改ueditor特定的html。 ueditor百度地图组件所在目录 show.html文件中...
  • 在一张图片动态的加上文字。怎么生成这样图片,android有什么好的方法和类可以用吗?最好有实例,非常感谢
  • 动态文字水印怎么做

    2019-11-20 11:00:20
    水印是把一些标识信息嵌入到信息载体中,在不影响原载体内容使用的同时,为原作者提供识别的手段,进而...像 Word 中增加水印很简单:菜单栏“设计”-“水印”(选择“自定义水印”),可以设置图片文字类水印。 ...
  • uni-app canvas绘制图片文字

    千次阅读 2020-11-19 13:32:36
    canvas画布 绘制远程图片 绘制文字 前言 前一段时间我们老师让我写一个关于画布功能的一个海报,这个海报是由图片文字组成,刚开始我是不太了解这个画布的,后来各种百度… 首先需要在结构层设置的画布宽高以及...
  • Js 图片 (或者任意元素) 添加文字

    千次阅读 2016-07-28 16:17:15
    使用js动态添加文字
  • 需要在图片上可以动态添加可拖动、可删除的文字编辑框,可改变文字大小颜色,之后可将批注保存为图片
  • 上传图片编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--canvas画布实现图片编辑 详细 一、前期准备工作 软件环境:...
  • 今天在做类似于qq那样的评论功能时,束手无策,在网上到处找答案,最后在一个很小很小的角落里受到了启发.... 输入文字,并且插入的图片还可以复制,从一个输入框复制到另外一个输入框. 收工.  
  • 1.在ps中打开要修改文字的gif图片,如: 2.在“窗口”中选择“动画”,如: 3.选择“动画”之后,效果如: 4.选择第二帧动画,第二个图层,如:   5.要想替换图片上的文字,先把图片上的文字...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,995
精华内容 31,998
关键字:

动态图编辑文字