如题,谁知道请告诉我~!感谢~
解决方案 »
- 请教字符串的编码处理
- 想请问下各位关于Excel的一个问题,只需说明下思路就OK.
- 不定长分组并进行组内组合的疑难问题(java or C)
- ApplicationWindow createContents() Question ,Thanks for ur suggestion.......vexation--vexation
- Hashtable<String,Double> balance=new Hashtable<String,Double>();,为何错误
- 请问怎么解释"迭代"一词的中文含义?
- 实现一个整型数组类似java.lang.String的charAt方法
- Java编写软件
- 初学java,基础的问题,征求答案,谢谢
- 萌新问一个关于jsoup POST的问题
- 给小弟个建议,我打算投身于计算机软件方面的工作,我该选c++,java, .net三个中哪个方向呢?(马上要分流了)!拿不定主意
- java怎么返回多个值类型的参数?
你可以学习一下import java.awt.*;
import java.io.*;
import java.awt.image.*;
public class BMPFile extends Component {
file://--- 私有常量
private final static int BITMAPFILEHEADER_SIZE = 14;
private final static int BITMAPINFOHEADER_SIZE = 40;
file://--- 私有变量声明
file://--- 位图文件标头
private byte bitmapFileHeader [] = new byte [14];
private byte bfType [] = {'B', 'M'};
private int bfSize = 0;
private int bfReserved1 = 0;
private int bfReserved2 = 0;
private int bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;file://--- 位图信息标头
private byte bitmapInfoHeader [] = new byte [40];
private int biSize = BITMAPINFOHEADER_SIZE;
private int biWidth = 0;
private int biHeight = 0;
private int biPlanes = 1;
private int biBitCount = 24;
private int biCompression = 0;
private int biSizeImage = 0x030000;
private int biXPelsPerMeter = 0x0;
private int biYPelsPerMeter = 0x0;
private int biClrUsed = 0;
private int biClrImportant = 0;file://--- 位图原始数据
private int bitmap [];file://--- 文件部分
private FileOutputStream fo;file://--- 缺省构造函数
public BMPFile() {}public void saveBitmap (String parFilename, Image parImage, int
parWidth, int parHeight) {
try {
fo = new FileOutputStream (parFilename);
save (parImage, parWidth, parHeight);
fo.close ();
}
catch (Exception saveEx) {
saveEx.printStackTrace ();
}}
/*
* saveMethod 是该进程的主方法。该方法
* 将调用 convertImage 方法以将内存图像转换为
* 字节数组;writeBitmapFileHeader 方法创建并写入
* 位图文件标头;writeBitmapInfoHeader 创建
* 信息标头;writeBitmap 写入图像。
*
*/
private void save (Image parImage, int parWidth, int parHeight) {try {
convertImage (parImage, parWidth, parHeight);
writeBitmapFileHeader ();
writeBitmapInfoHeader ();
writeBitmap ();
}
catch (Exception saveEx) {
saveEx.printStackTrace ();
}
}
/*
* convertImage 将内存图像转换为位图格式 (BRG)。
* 它还计算位图信息标头所用的某些信息。
*
*/
private boolean convertImage (Image parImage, int parWidth, int parHeight) {
int pad;
bitmap = new int [parWidth * parHeight];
PixelGrabber pg = new PixelGrabber (parImage, 0, 0, parWidth, parHeight,
bitmap, 0, parWidth);
try {
pg.grabPixels ();
}
catch (InterruptedException e) {
e.printStackTrace ();
return (false);
}pad = (4 - ((parWidth * 3) % 4)) * parHeight;
biSizeImage = ((parWidth * parHeight) * 3) + pad;
bfSize = biSizeImage + BITMAPFILEHEADER_SIZE +
BITMAPINFOHEADER_SIZE;
biWidth = parWidth;
biHeight = parHeight;return (true);
}/*
* writeBitmap 将象素捕获器返回的图像转换为
* 所需的格式。请记住:扫描行在位图文件中是
* 反向存储的!
*
* 每个扫描行必须补足为 4 个字节。
*/
private void writeBitmap () {int size;
int value;
int j;
int i;
int rowCount;
int rowIndex;
int lastRowIndex;
int pad;
int padCount;
byte rgb [] = new byte [3];
size = (biWidth * biHeight) - 1;
pad = 4 - ((biWidth * 3) % 4);
if (pad == 4) // <==== 错误修正
pad = 0; // <==== 错误修正
rowCount = 1;
padCount = 0;
rowIndex = size - biWidth;
lastRowIndex = rowIndex;try {
for (j = 0; j < size; j++) {
value = bitmap [rowIndex];
rgb [0] = (byte) (value & 0xFF);
rgb [1] = (byte) ((value >> 8) & 0xFF);
rgb [2] = (byte) ((value >> 16) & 0xFF);
fo.write (rgb);
if (rowCount == biWidth) {
padCount += pad;
for (i = 1; i <= pad; i++) {
fo.write (0x00);
}
rowCount = 1;
rowIndex = lastRowIndex - biWidth;
lastRowIndex = rowIndex;
}
else
rowCount++;
rowIndex++;
}file://--- 更新文件大小
bfSize += padCount - pad;
biSizeImage += padCount - pad;
}
catch (Exception wb) {
wb.printStackTrace ();
}} /*
* writeBitmapFileHeader 将位图文件标头写入文件中。
*
*/
private void writeBitmapFileHeader () {try {
fo.write (bfType);
fo.write (intToDWord (bfSize));
fo.write (intToWord (bfReserved1));
fo.write (intToWord (bfReserved2));
fo.write (intToDWord (bfOffBits));}
catch (Exception wbfh) {
wbfh.printStackTrace ();
}}/*
*
* writeBitmapInfoHeader 将位图信息标头
* 写入文件中。
*
*/private void writeBitmapInfoHeader () {try {
fo.write (intToDWord (biSize));
fo.write (intToDWord (biWidth));
fo.write (intToDWord (biHeight));
fo.write (intToWord (biPlanes));
fo.write (intToWord (biBitCount));
fo.write (intToDWord (biCompression));
fo.write (intToDWord (biSizeImage));
fo.write (intToDWord (biXPelsPerMeter));
fo.write (intToDWord (biYPelsPerMeter));
fo.write (intToDWord (biClrUsed));
fo.write (intToDWord (biClrImportant));
}
catch (Exception wbih) {
wbih.printStackTrace ();
}}
/*
*
* intToWord 将整数转换为单字,返回值
* 存储在一个双字节数组中。
*
*/
private byte [] intToWord (int parValue) {byte retValue [] = new byte [2];retValue [0] = (byte) (parValue & 0x00FF);
retValue [1] = (byte) ((parValue >> 8) & 0x00FF);return (retValue);}/*
*
* intToDWord 将整数转换为双字,返回值
* 存储在一个 4 字节数组中。
*
*/
private byte [] intToDWord (int parValue) {byte retValue [] = new byte [4];retValue [0] = (byte) (parValue & 0x00FF);
retValue [1] = (byte) ((parValue >> 8) & 0x000000FF);
retValue [2] = (byte) ((parValue >> 16) & 0x000000FF);
retValue [3] = (byte) ((parValue >> 24) & 0x000000FF);return (retValue);}}
然后画到Canvas上就是了
保存的话用java.imageIO.ImageIO这个类中的write方法
我写了从ablum表中读字段data二进制数据
//import java.io.*;
import javax.imageio.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Blob;
public class showimage_1 { public static void main(String[] args) {
try{//datesource and select sql
String sql="SELECT * FROM ablum where id=5";
String acurl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=image.mdb";
//加载(sun公司)的JDBC-ODBC bridge驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(acurl);
//show select result
System.out.println("below you can see the result select from album:");
System.out.println("=====================");
System.out.println("连库成功!");
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
ImageOutputStream op=createImageOutputStream();
while(rs.next()){
Blob blob=rs.getBlob( "data" );
byte[] ab = blob.getBytes(1, (int)blob.length());
op.write(ab);
op.flush();
op.close(); }
stmt.close();
conn.close();
}
catch(SQLException ex){
System.out.println("SQL异常出错!");
System.out.println(ex.getMessage());
}
catch(Exception ex){
ex.printStackTrace();
// 错误跟踪
}
}}
在这行出现了错误提示
上楼的朋友,还有大伙看看是怎么回事