扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
图片文件中的数据,本身就是点阵。比如bmp格式的文件头偏移12h~15h是宽度,偏移16h~19h是高度,图像部分的数据,就是按帆旁这尺寸记录着每个像素点...。
华安ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
建议装个UltraEdit工具,洞蠢对文件的结构进行分析,或在态颤橡网上搜搜关于图像数据结构方面的资料,自然,你就对图片的数据心中了然的了。
下面的方法可以实现,它可以衡高按照指定的字体将字符串转换为点阵的2维数组:
import java.awt.Font;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import javax.swing.plaf.metal.DefaultMetalTheme;
public class FontTest {
public static void main(String[] args) {
try {
DefaultMetalTheme theme = new DefaultMetalTheme();
Font font = new Font(theme.getWindowTitleFont().getFamily(), Font.PLAIN, 30); // 创建字体
AffineTransform at = new AffineTransform();
FontRenderContext frc = new FontRenderContext(at, true, true);
GlyphVector gv = font.createGlyphVector(frc, "ABC a $@#*^"); // 要显示的文字
Shape shape = gv.getOutline(5, 30);
int weith = 200; // 显示脊拦做面板的宽
int height = 40; /樱衡/ 显示面板的高
boolean[][] view = new boolean[weith][height];
for (int i = 0; i weith; i++) {
for (int j = 0; j height; j++) {
if (shape.contains(i, j)) {
view[i][j] = true;
} else {
view[i][j] = false;
}
}
}
for (int j = 0; j height; j++) {
for (int i = 0; i weith; i++) {
if (view[i][j]) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
用Java语言画的点阵渐开线代码如下
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
public class Involute extends JFrame{
Involute(){
super("点阵渐开线");
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public void paint(Graphics g){
super.paint(g);
double alfa=10;
double r=10;
锋让double theta=0;
ListInteger lx=new ArrayListInteger();
ListInteger ly=new ArrayListInteger();
int CenterX=this.getWidth()/2;
int CenterY=this.getHeight()/2;
for(int i=0;i60*2;i++){
int x=CenterX+(int)(r*Math.cos((theta+alfa)*Math.PI/180)+(theta+alfa)*Math.PI/180*r*Math.sin((theta+alfa)*Math.PI/180));
lx.add(x);
int y=CenterY-(int)(r*Math.sin((theta+alfa)*Math.PI/180)-(theta+alfa)*Math.PI/180*r*Math.cos((theta+alfa)*Math.PI/180));
ly.add(y);
theta=theta+6;
银卖局 }
for(int i=0;i60*2;i++){
g.fillOval(lx.get(i), ly.get(i), 5, 5);
}
}
public static void main(String[] args) {
配旁new Involute();
}
}
运行结果
以前DOS时代搞过这个。如果你能拿到GB_2312字库,就能做到。将Unicode码转变为GB码,然后激困磨高字节-0xA0,乘以94,再加低字节-0xA0,这个结果乘以32,去字库文件里从头偏移这么多,读32字节,按位每16位一行画点就是汉字图形。
图形好像是翻转的,时间长了明斗具体记不清了。
试验了一下,记错了一点。是减手0xA1。下面的这个类的静态方法getDotMap获取一个字的32字节的点阵。每位为1时应该绘制,0时不绘制。
public class ChineseReader extends JFrame{
private static byte[][] dotMap;
static{
try{
FileInputStream dotMapFile=new FileInputStream("hzk16");
dotMap=new byte[dotMapFile.available()][32];
for(int i=0;idotMap.length;i++){
dotMapFile.read(dotMap[i]);
}
dotMapFile.close();
}
catch(FileNotFoundException ex){
ex.printStackTrace();
}
catch(IOException ex){
ex.printStackTrace();
}
}
public static short[] getDotMap(char c){
short[] buffer=new short[16];
int gbCode=Charset.forName("GB2312").encode(String.valueOf(c)).getShort()0xFFFF;
ByteBuffer buf=ByteBuffer.wrap(dotMap[((gbCode8)*94+(gbCode0xFF))-0x3BBF]);
for(int i=0;i16;i++){
buffer[i]=buf.getShort();
}
return buffer;
}
}
假设汉字尺袭库文件以“hzk16”命名,存放在同一文件夹中。你自己找不到16点阵汉字库时,找个UCDOS下载,从中能找到的。文件名就是HZK16。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流