【问题标题】:Need help create image from sqlite database需要帮助从 sqlite 数据库创建图像
【发布时间】:2011-11-02 08:23:38
【问题描述】:

我正在尝试在 Java Swing 应用程序中从 SQLite 数据库创建图像。但它向我显示了错误。我正在使用 JDK 1.6、Java 6、SQLite 3、sqlitejdbc-v056.jar 来连接 SQLite 和 Ubuntu 11.04。我从here 获得 sqlite 连接器。这是我的代码:

pos.res = pos.statement.executeQuery("select * from customer where card_id = "+card_id+";");

            while(pos.res.next()){
                if(pos.defaultParams != null){
                    pos.defaultParams.remove("pricelist_id");
                }else{
                    pos.defaultParams = new HashMap<String, Object>();
                }
                pos.defaultParams.put("pricelist_id", pos.res.getString("pricelist"));
                pos.jTextPane6.setText(pos.res.getString("name").toString());
                pos.customderId = Integer.parseInt(pos.res.getString("customer_id"));
                pos.jTextPane7.setText(pos.res.getString("department").toString());
                byte[] byt = pos.res.getString("photo").toString().getBytes();
                InputStream in = new ByteArrayInputStream(byt);
                BufferedImage image = ImageIO.read(in);
                ImageIO.write(image, "jpg",new File("/home/foo/Desktop/jj.jpg"));
                Graphics2D g = (Graphics2D)pos.jPanel4.getGraphics(); 
                g.drawImage(resize(image, 111, 100), null, 0, 0);
            }


private static BufferedImage resize(BufferedImage image, int width, int height) {
        BufferedImage resizedImage = new BufferedImage(width, height,
        BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(image, 0, 0, width, height, null);
        g.dispose();
        return resizedImage;
    }

我收到以下错误:

Nov 2, 2011 4:12:04 PM pointofsale.setCustomer set
SEVERE: null
java.lang.IllegalArgumentException: image == null!
1819 [AWT-EventQueue-0] DEBUG pointofsale.PointOfSaleView  - endting setCustomer.set func
    at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:1038)
    at javax.imageio.ImageIO.getWriter(ImageIO.java:1581)
    at javax.imageio.ImageIO.write(ImageIO.java:1510)
    at pointofsale.setCustomer.set(setCustomer.java:65)
    at pointofsale.PointOfSaleView.focusGained(PointOfSaleView.java:1032)
    at java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:220)
    at java.awt.Component.processFocusEvent(Component.java:6092)
    at java.awt.Component.processEvent(Component.java:5959)
    at java.awt.Container.processEvent(Container.java:2105)
    at java.awt.Component.dispatchEventImpl(Component.java:4564)
    at java.awt.Container.dispatchEventImpl(Container.java:2163)
    at java.awt.Component.dispatchEvent(Component.java:4390)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1881)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:936)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:551)
    at java.awt.Component.dispatchEventImpl(Component.java:4434)
    at java.awt.Container.dispatchEventImpl(Container.java:2163)
    at java.awt.Component.dispatchEvent(Component.java:4390)
    at sun.awt.X11.XWindow$1.run(XWindow.java:378)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647)
    at java.awt.EventQueue.access$000(EventQueue.java:96)
    at java.awt.EventQueue$1.run(EventQueue.java:608)
    at java.awt.EventQueue$1.run(EventQueue.java:606)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:617)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

请帮帮我?

【问题讨论】:

    标签: java swing sqlite


    【解决方案1】:

    您的问题是 ImageIO.read() 失败。这可能是由于这段代码:

    pos.res.getString("photo").toString().getBytes();
    

    永远不要将String 类型用于二进制数据,也永远不要使用getBytes() - 这取决于您的平台默认编码。这意味着:它将采用字符串中的 Unicode 字符并将它们转换为您的计算机认为好的任何内容。这会破坏你的二进制数据。

    正确的解决方案是使用 BLOB 列。请参阅此答案如何将 BLOB 写入 sqlite:cannot save image as blob to sqlite

    阅读代码类似

    如果这不是一个选项,则使用编码ISO-8859-1,如果您的String 中没有 Unicode 字符(任何代码点 > 255 的字符),则该编码是 1:1 映射。

    不要忘记编写一些单元测试以确保您的代码正常工作。

    【讨论】:

    • 哇。非常感谢。它解决了我的问题。你拯救了我的一天。
    【解决方案2】:

    使用此代码获取字节:

    Blob blob = pos.res.getBlob("photo");
    bytes[] b = blob.getBytes(1, (int) blob.length());
    

    【讨论】:

    • 嗨,伙计。当我尝试使用您的代码时,我收到“java.sql.SQLException:SQLite JDBC 驱动程序未实现”错误。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2010-11-08
    相关资源
    最近更新 更多