【问题标题】:Grab image data from URL via proxy and convert to base64通过代理从 URL 中获取图像数据并转换为 base64
【发布时间】:2017-09-11 13:48:42
【问题描述】:

我有一个关于通过代理从 URL 抓取图像并将其转换为 base64 的问题。

有没有像下面的jsoup方法这样简单的方法?

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxyurl", 8080))
Document doc = Jsoup.connect("mytargeturl").proxy(proxy).get()
Elements headline = doc?.getElementsByClass("myHTMLclass")

我希望在 Groovy/Java(最好是 Groovy)中做到这一点。

到目前为止,我已经到了这里:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxy", 8080))
URL url = new URL("https://maps.googleapis.com/maps/api/staticmap?size=600x400&markers=size:large%7Ccolor:yellow%7Clabel:A%7CNew%20York")
def image = url.openConnection(proxy).getContent()

println(image)

但我得到sun.awt.image.URLImageSource@26d9b808 作为控制台的输出

有人可以帮忙吗?有问题的图像是这个:

为了清楚起见,我想从上面提到的 URL 中抓取上面的图像(实际图像)并将其转换为 base64 字符串。

【问题讨论】:

    标签: image url groovy proxy


    【解决方案1】:

    只要做:

    // By default this won't use a proxy, but if you pass one in, it will!
    String toBase64(URL url, Proxy proxy = Proxy.NO_PROXY) {
       url.openConnection(proxy).inputStream.withCloseable {
           it.bytes.encodeBase64()
       }
    }
    
    URL url = new URL("https://maps.googleapis.com/maps/api/staticmap?size=600x400&markers=size:large%7Ccolor:yellow%7Clabel:A%7CNew%20York")
    
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxyurl", 8080));
    
    String encoded = toBase64(url, proxy)
    

    【讨论】:

    • 把它做成一个单行,它似乎正在工作:def encodedImage = mapUrl.openConnection(myProxy).inputStream.withCloseable { it.bytes.encodeBase64() }
    • 很有趣,直到你再次需要它;-)
    【解决方案2】:

    不确定代理设置,但是如果您想使用java将图像转换为base64,那么您可以使用以下代码。

    public class ChangeBase {
    
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
    
        String encodstring = encodeFileToBase64("http://imageurl");
        System.out.println(encodstring);
    
    }
    
    private static byte[] getByteFromImage(String urlStr) throws Exception {
        URL url = new URL(urlStr);
        BufferedImage image = ImageIO.read(url);
        // get DataBufferBytes from Raster
        WritableRaster raster = image.getRaster();
        DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
        return data.getData();
    }
    
    private static String encodeFileToBase64(String url) {
        String encodedString = null;
        try {
            byte[] bytes = getByteFromImage(url);
            encodedString = new String(Base64.getEncoder().encode(bytes), "UTF-8");
    
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return encodedString;
    }
    }
    

    注意:我使用上面的代码存储在我的驱动器中的图像,你可以尝试使用来自 url 的图像,建议一个是从 url 创建字节到文件并将相同的传递给 encodeFiletoBase64 方法,不要'不在系统上本地保存文件。

    【讨论】:

    • 按照getByte的编辑代码,直接从URL转换为Base64。
    • 谢谢@Simmant,但是这东西有没有像一个班轮的?我有类似的东西跨越多行。我只是想让事情比这些低级的东西简单得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多