ScalaFX:如何将图像对象转换为字节数组
ScalaFX: How to convert an Image object to a byte array
下面是使用 ScalaFX 和 ZXing 生成二维码的代码:
import java.util.{HashMap => JavaHashMap}
import org.apache.commons.codec.binary.Base64
import scalafx.scene.image.{Image, PixelFormat, WritableImage}
import scalafx.scene.paint.Color
import com.google.zxing.common.BitMatrix
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import com.google.zxing.{BarcodeFormat, EncodeHintType}
object QRCode {
private val hints = new JavaHashMap[EncodeHintType, Any]() {
put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L)
}
def encode(text: String, size: Int): String = {
val bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints)
val image = toWritableImage(bitMatrix)
val bytes = // how do I convert image to a byte array?
Base64.encodeBase64String(bytes)
}
private def toWritableImage(bitMatrix: BitMatrix): WritableImage = {
val image = new WritableImage(bitMatrix.getWidth, bitMatrix.getHeight)
val writer = image.getPixelWriter
val format = PixelFormat.getByteRgbInstance
for (y <- 0 to (bitMatrix.getHeight - 1); x <- 0 to (bitMatrix.getWidth - 1)) {
writer.setColor(x, y, if (bitMatrix.get(x, y)) Color.Black else Color.White)
}
image
}
}
由于我需要 QR 码作为 base64 字符串,我想知道如何将 Image
对象转换为字节数组,以便我可以使用 Apache 的 commons-codec 将其转换为 base64。
使用 SwingFXUtils
上的 fromFXImage
方法将 WritabableImage
转换为 BufferedImage
。 BufferedImage
又可以使用 ImageIO.write
写入流。如果您传入 ByteArrayOutputStream
,您可以从流中获取 byte[]
。
下面是使用 ScalaFX 和 ZXing 生成二维码的代码:
import java.util.{HashMap => JavaHashMap}
import org.apache.commons.codec.binary.Base64
import scalafx.scene.image.{Image, PixelFormat, WritableImage}
import scalafx.scene.paint.Color
import com.google.zxing.common.BitMatrix
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import com.google.zxing.{BarcodeFormat, EncodeHintType}
object QRCode {
private val hints = new JavaHashMap[EncodeHintType, Any]() {
put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L)
}
def encode(text: String, size: Int): String = {
val bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints)
val image = toWritableImage(bitMatrix)
val bytes = // how do I convert image to a byte array?
Base64.encodeBase64String(bytes)
}
private def toWritableImage(bitMatrix: BitMatrix): WritableImage = {
val image = new WritableImage(bitMatrix.getWidth, bitMatrix.getHeight)
val writer = image.getPixelWriter
val format = PixelFormat.getByteRgbInstance
for (y <- 0 to (bitMatrix.getHeight - 1); x <- 0 to (bitMatrix.getWidth - 1)) {
writer.setColor(x, y, if (bitMatrix.get(x, y)) Color.Black else Color.White)
}
image
}
}
由于我需要 QR 码作为 base64 字符串,我想知道如何将 Image
对象转换为字节数组,以便我可以使用 Apache 的 commons-codec 将其转换为 base64。
使用 SwingFXUtils
上的 fromFXImage
方法将 WritabableImage
转换为 BufferedImage
。 BufferedImage
又可以使用 ImageIO.write
写入流。如果您传入 ByteArrayOutputStream
,您可以从流中获取 byte[]
。