如何在React Native中往图片上添加文字?

10
我正在研究使用React Native轻松实现此功能,或者是否应该构建本地应用程序。
我想从照片库中编辑一张图片,并在其上添加文本叠加。可以将其视为带有问候信息的明信片。
如何在React Native中向图像添加文本并创建一个新副本?我不需要详细的代码,只需要解释如何开始。
更新: 保存消息在图片上的坐标是否是一个好的替代方案,而无需生成新的图片?

一些时间过去了...你实现了解决方案吗?我想为视频做这件事。如果你已经实现了,能否在这里发布代码? - Yossi
10个回答

19

你有两种选择。一种是将文本呈现在图像组件上并保存该文本的位置,另一种是处理图像并获取带有该文本的新图像。

第一种选择会带来一个问题,即位置相对于图像大小而言。这意味着,如果图像在不同大小的屏幕上呈现,则文本的位置和大小也应相应移动。此选项需要良好的计算算法。另外,渲染时间可能是另一个问题。文本组件将立即呈现,但是图像组件需要首先加载图像。此选项还需要良好的渲染算法。

第二种选择需要使用第三方库或一定级别的原生代码,因为React Native不支持超出CSS限制的图像处理。一个好的、维护良好的图像处理库是gl-react-native-v2。该库可帮助您按照希望进行处理和操作图像,然后使用captureFrame(config)保存结果。虽然此选项更能够处理文件,但需要您保存新图像。

无论哪种方法都可以,只要您选择的方式适合您的用例。决策实际上取决于您的情况和偏好。


好的答案。所以你会推荐使用gl-react-native而不是使用react-native-view-shot来进行快照。 - crispychicken
1
@crispychicken 谢谢。我不能特别推荐一个库。如果另一个库对您更好或者更适合您的情况,那么您应该选择它。gl-react-native只是一个图像处理库的例子。 - bennygenel
@bennygenel 有没有关于在React Native中添加文本到视频的想法? - Yossi
1
@Yossi 我没有相关经验,但我认为方法应该是相同的。 - bennygenel
链接版本已过期。新版本带有漂亮的在线演示,可在此处获取:https://github.com/gre/gl-react - Gio

4
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center', marginTop: 20}}>
    <Image
     style={{
       flex: 1,
       width:100,
       height:100,
     }}
     source={require('../imgs/star.png')}
     />
     <Text style={{position: 'absolute', fontSize: 20}}>890</Text>
 </View>

4
你可以使用react-native的ImageBackground标签,因为使用Image标签作为容器会给你一个黄盒子警告
以下是带有覆盖效果的示例代码。
<ImageBackground source={SomeImage} style=  {SomeStyle} resizeMode='SomeMode'>
   {loader}
</ImageBackground>

如果您在图像样式中更改flex属性,或者将position: absolute设置为主图像容器并将top,bottom,left,right分配给嵌套容器,则可以通过更改相同图像来提高效率。

有用的链接可以在这里找到。


2

由于向图像添加子元素已被弃用,因此您可以使用position: absolute。以下代码将在图像上垂直和水平居中对齐文本:

<View>
    <Image
        source={yourImageUrl}
        resizeMode={'cover'}
        style={{
            width: 300,
            height: 300
        }}
    />

    <View style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 300, alignItems: 'center', justifyContent: 'center' }}>
        <Text>Your overlay text</Text>
    </View>
</View>

2

我正在研究是否可以使用React Native轻松实现,或者是否应该构建原生应用程序。

在React Native中完成这个任务听起来非常可行。

我想从照片库中编辑一张图片,并添加文本覆盖。就像一张带有问候信息的明信片。

我认为我会将所有相关元数据作为一个对象捕获...

{
    image: {
        uri: './assets/image.jpg',
        height: 576,
        width: 1024
    },
    message: {
        fontFace: 'Calibri',
        fontSize: 16,
        text: 'Happy Holidays!'
        boundingBox: { 
            height: '30%',
            width: '30%',
            top: 0,
            left: 0
        }
    }
}

通过上述细节(或更多),您将能够在任何设备上重构设计意图,无论其大小(平板电脑与移动设备)或像素深度。 boundingBox 将以相对于图像呈现尺寸的术语表达。在上面的示例中,消息将包含在文本框中,不超过图像宽度的30%,高度的30%,并位于左上角。

我如何在React Native中向图像添加文本并创建新副本?

这消除了需要进行任何截屏或实际图像操作等的需要。无需“创建新副本”。只需将它们视为两个单独且不同的资产,然后使用捕获的元数据在呈现时合并它们。
最后的想法:如果您“需要”按照您在另一个评论中所述的那样“上传完成的照片到服务器”,则可以使用任何数量的技术在服务器端使用元数据作为指南来完成此操作。

我认为你的boundingBox逻辑有一些问题。虽然像你说的那样,如果你给盒子相对大小,文本的大小总是用fontSize设置的。 - bennygenel
@bennygenel 感谢您的反馈。我不确定您所说的“有一些流动性”是什么意思。当然,fontSize也需要是相对的,但我认为这个概念仍然传达了出来,您觉得呢? - Chris Geirman
调整字体大小需要计算原始图像尺寸和当前图像视图尺寸的比例,然后设置字体大小。同样的,定位也是一样的,您应该针对新尺寸调整定位。例如,如果文本在500px图像上从x:100开始,则在250px上应该从x:50开始。 - bennygenel
让我理解的意思 - Chris Geirman

1
如果您只需要在图像上显示文本,您可以将图像包裹在视图中,并在图像后插入一个具有position: 'absolute'的文本元素。如果您想要包含文本的图像副本,则可以使用相同的方法,但是使用react-native-view-shot拍摄快照。

好主意,但我认为图像质量会变差,图像尺寸会缩小到手机像素大小... - crispychicken
应用程序的目的是什么? - Alexander Vitanov
在平板电脑上显示贺卡并附带问候语。因此,图像质量应针对平板电脑尺寸进行优化。图片是用手机拍摄的。 - crispychicken
用户能够保存图像吗?如果不能,那么您可以使用我上面解释的设置简单地提取新组件。 - Alexander Vitanov
我需要将完成的照片上传到服务器。 - crispychicken
我认为你可以设置图像的最大宽度和高度,以及文本,然后进行快照。顺便说一下,在客户端进行图像处理是一个比较繁重的任务,我建议你在服务器上进行处理。 - Alexander Vitanov

1
据我所知,图像组件可以用作容器,因此您可以执行以下操作:
<Image>
  <Text>{"some text"}</Text>
</Image>

2
他需要将编辑后的图片上传到服务器。此外,向图像添加子元素已被弃用。 - Alexander Vitanov

1
以下是我用来在图像上特定坐标添加文本的代码。 Xcode 8.3.2 Swift 3.1
func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
        let textColor = UIColor.white
        let textFont = UIFont(name: "Helvetica Bold", size: 10)!

        let scale = UIScreen.main.scale
        UIGraphicsBeginImageContextWithOptions(image.size, false, scale)

        let textFontAttributes = [
            NSFontAttributeName: textFont,
            NSForegroundColorAttributeName: textColor,
            ] as [String : Any]
        image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))

        let rect = CGRect(origin: point, size: image.size)
        text.draw(in: rect, withAttributes: textFontAttributes)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()


        return newImage!
    }

并按以下方式调用上述方法:
let imageWithText = textToImage(drawText: "textOnImage", inImage:yourImage, atPoint: CGPoint(x:9,y:11))

0

这取决于使用情况,但如果您只想在图像上放置文本,则使用ImageBackground是一个不错的方法之一。

请按以下方式操作。

<ImageBackground
  source={{ uri: hoge }}
  style={{
    height: 105,
    width: 95,
    position: 'relative', // because it's parent
    top: 7,
    left: 5
  }}
>
  <Text
    style={{
      fontWeight: 'bold',
      color: 'white',
      position: 'absolute', // child
      bottom: 0, // position where you want
      left: 0
    }}
  >
    hoge
  </Text>
</ImageBackground>


0

有几个库可供使用。如果您想将文本添加到图像中,可以使用:react-native-media-editor。这是一个相当不错的选项,用于向图像添加文本,但我建议您使用react-native-image-tools。它提供了如此多的灵活性。您可以添加文本并相应地定位它。除此之外,还有滤镜、裁剪选项、光线调整等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接