如何在图片上写文字

本文介绍了一种通过在内存中创建图片副本的方式来进行图片处理的方法,包括如何创建图片副本、使用画布和画笔进行绘图操作,以及如何实现文字的绘制和换行布局。最后还介绍了如何将修改后的图片保存到本地。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们要处理一张图片,并不会直接在这张图片上直接进行处理,一般都会在内存中创建这张图片的copy,然后在这张copy上对图片进行处理

创建图片内存拷贝

  1. 根据原图创建大小一摸一样的空白图片。

      Bitmap bitmapCopy = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
    

    当然,创建的图片的副本尺寸也可以比原图不一样,

    Bitmap bitmapCopy = Bitmap.createBitmap(bitmap.getWidth()*1.5, bitmap.getHeight()*1.5, bitmap.getConfig());

    注:网络图片的话,可以通过Picasso来获取bitmap,一定要在子线程,耗时操作

      new Thread(){
                @Override
                public void run() {
                    super.run();
                    try {
                        bitmap_xk = Picasso.with(PreviewPicActivity.this).load(R.drawable.xk).resize(1536,768).get();
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
    
  2. 根据空白图片创建一个画布

     Canvas canvas = new Canvas(bitmapCopy);
    
  3. 创建画笔,设置画笔属性

     Paint paint = new Paint();
     paint.setColor(Color.parseColor("#000000"));
     paint.setTextSize(18);
     paint.setAntiAlias(true);//抗锯齿
    
  4. 临摹

    Matrix matrix = new Matrix();
    canvas.drawBitmap(bitmap(原图), matrix, paint);
    

至此,已经将一张图片copy到内存中

开始往照片上写字

如果文字很短,不需要换行
canvas.drawText()
当写的是多行文本时,如何控制换行—>StaticLayout
    //设置画笔
    TextPaint textPaint = new TextPaint();
    textPaint.setColor(Color.parseColor("#ffffff"));
    //确定祝福文字的大小,因为图片像素不一样,为了达到统一效果,按照图片像素来确定文字大小
    float textsize = (float) (bitmap.getHeight() * 0.1);
    textPaint.setTextSize(textsize);
    textPaint.setAntiAlias(true);

//文字换行最大宽度,在这里我们想让当文字超过图片宽度50%时,就换行
int msgMaxWidth = (int) (bitmap.getWidth() * 0.50);

StaticLayout layout = new StaticLayout(content, textPaint, msgMaxWidth,
            Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);
    canvas.save();
    canvas.translate(startX, startY);//从20,20开始画

    layout.draw(canvas);
    canvas.restore();//别忘了restore

public StaticLayout(CharSequence source, TextPaint paint,
    int width,  Alignment align, float spacingmult, float spacingadd,boolean includepad) 


source:文本内容
textPaint:画笔
width:layout的宽度,字符串超出宽度时自动换行。
Alignment:layout的对齐方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种。
spacingmult:相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。
spacingadd:在基础行距上添加多少(实际行间距等于这两者的和)。
includepad:不懂,写true先

把内存中的图片保存到本地

  private void save(Bitmap bitmap_copy) {
        try {
            File file = new File(Environment.getExternalStorageDirectory(), "99999999999991.jpg");
            FileOutputStream stream = new FileOutputStream(file);
            bitmap_copy.compress(Bitmap.CompressFormat.JPEG, 100, stream);//100表示图片压缩质量,100为最高
            stream.close();
            Toast.makeText(PreviewPicActivity.this, "保存成功", Toast.LENGTH_SHORT).show();

        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(PreviewPicActivity.this, "保存失败", Toast.LENGTH_SHORT).show();
        }
    }
<think>好的,我需要帮助用户了解如何使用Python的Pillow库在图片上添加文字。首先,我需要确认用户的需求:他们想通过Pillow库在图片上添加文字,并需要示例代码。用户可能已经知道Pillow的基本安装,但可能需要具体的步骤和代码示例。 首先,我应该检查Pillow库的安装方法,确保用户已经正确安装。根据引用[3],用户可以从PyPI获取最新版本,特别是Windows用户可能需要二进制文件。所以,在回答中应该提到安装步骤,比如使用pip安装。 接下来,用户需要具体的代码示例。根据引用[2],Pillow可以用于合并图片,比如添加水印或logo,这也包括添加文字。因此,我需要解释如何打开图片,使用ImageDraw模块创建绘图对象,然后使用text()方法添加文字。 我需要考虑设置字体、颜色、位置等参数。字体可能需要指定路径,特别是用户可能需要下载.ttf文件,比如使用默认的Arial字体或者提供其他字体选项。如果用户未指定字体,Pillow可能无法正确渲染文本,所以需要提醒这一点。 此外,文字的位置坐标(xy)可能需要调整,用户可能需要根据图片尺寸来动态计算,比如居中文本。这里可以给出一个示例,计算文本的宽度和高度,然后调整位置。 还需要提到如何保存修改后的图片,使用save()方法,并可能支持不同的格式。 最后,用户可能需要进一步的自定义,比如调整字体大小、颜色、透明度等,所以在相关问题上可以建议这些方向。 现在,整理步骤:安装Pillow,导入模块,打开图片,创建Draw对象,定义字体,添加文本,保存图片。示例代码需要包括这些步骤,并处理可能出现的异常,比如字体文件未找到。 可能的问题点:字体路径在不同操作系统下的处理,比如在Linux下可能使用/usr/share/fonts,而Windows可能在C:\Windows\Fonts。需要提醒用户根据实际情况调整路径。 检查是否需要处理透明度或图层混合,但基础示例可能不需要这些,高级用户可以自行探索。 总结回答结构:先介绍步骤,给出示例代码,然后解释代码各部分,最后提供相关问题和引用。</think>要使用Pillow库在图片上添加文字,可通过以下步骤实现: ### 步骤说明 1. **安装Pillow库** ```bash pip install Pillow ``` 2. **基础代码框架** ```python from PIL import Image, ImageDraw, ImageFont # 打开图片 image = Image.open("input.jpg") # 创建绘图对象 draw = ImageDraw.Draw(image) # 设置字体(需指定.ttf文件路径) font = ImageFont.truetype("arial.ttf", 36) # 添加文字(参数:坐标、内容、颜色、字体) draw.text((50, 50), "Hello Pillow", fill="white", font=font) # 保存结果 image.save("output.jpg") ``` ### 详细说明 - **字体设置**:必须使用`.truetype()`加载字体文件。若未安装字体,可从系统字体目录(如Windows的`C:\Windows\Fonts`)复制.ttf文件到项目目录[^3] - **坐标系统**:原点`(0,0)`在左上角,可通过`image.size`获取图片尺寸动态计算居中位置: ```python text_width, text_height = draw.textsize("Hello Pillow", font=font) x = (image.width - text_width) // 2 y = (image.height - text_height) // 2 ``` ### 完整示例(含居中文字与抗锯齿) ```python from PIL import Image, ImageDraw, ImageFont def add_centered_text(input_path, output_path, text, font_size=40, color=(255,255,255)): img = Image.open(input_path) draw = ImageDraw.Draw(img) try: font = ImageFont.truetype("arial.ttf", font_size) except IOError: font = ImageFont.load_default() # 备选方案 text_width, text_height = draw.textsize(text, font=font) x = (img.width - text_width) // 2 y = (img.height - text_height) // 2 # 添加黑色描边增强可读性 draw.text((x-1, y-1), text, fill="black", font=font) draw.text((x+1, y), text, fill="black", font=font) draw.text((x, y), text, fill=color, font=font) img.save(output_path) # 使用示例 add_centered_text("background.jpg", "result.jpg", "WATERMARK", color=(255,0,0)) ``` ### 效果增强技巧 - 通过多层文字绘制实现描边效果 - 使用`.alpha_composite()`叠加半透明水印[^2] - 调整`font`参数中的`stroke_width`实现文字边框
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值