Code Monkey home page Code Monkey logo

panpf / sketch Goto Github PK

View Code? Open in Web Editor NEW
2.0K 54.0 307.0 266.67 MB

Sketch is an image loading library designed for Compose Multiplatform and Android View. It is powerful and rich in functions. In addition to basic functions, it also supports GIF, SVG, video thumbnails, Exif Orientation, etc.

License: Apache License 2.0

Kotlin 99.98% Shell 0.02%
android gif image image-orientation image-loader base64-image video-thumbnail apk-icon exif jetpack-compose

sketch's Introduction

logo_image Sketch Image Loader

Platform License version_icon QQ Group

Translations: 简体中文

Sketch is an image loading library specially designed for Compose Multiplatform and Android View. It has the following features:

  • Multiple sources: Supports loading images from multiple sources such as http, file, compose.resource, android asset/content/resource, etc.
  • Powerful functions: Supports three-level caching, automatically cancels requests, automatically adjusts image size, automatically rotates images according to Exif Orientation, etc.
  • Rich functions: Supports Animated image, SVG images, Base64 images, and video frames
  • Easy to expand: Supports expansion of various aspects such as caching, decoding, transformation, transition, placeholder, etc.
  • Special functions: Practical extensions such as pausing downloads when cellular data is provided, pausing loading during list scrolling, image type badges, download progress indicators, etc.
  • Modern: Completely based on Kotlin and Kotlin coroutine design

Download

Published to mavenCentral

${LAST_VERSION}: Download (Not included 'v')

Compose Multiplatform:

// Provides the core functions of Sketch as well as singletons and extension 
// functions that rely on singleton implementations
implementation("io.github.panpf.sketch4:sketch-compose:${LAST_VERSION}")

Important

To improve the performance of compose, please copy compose_compiler_config.conf under the sketch-core module file to your project and configure it according to the Compose Stability Configuration documentation

Android View:

// Provides the core functions of Sketch as well as singletons and extension 
// functions that rely on singleton implementations
implementation("io.github.panpf.sketch4:sketch-view:${LAST_VERSION}")

There are also some optional modules:

// Use Android or Skia's built-in decoder to decode gif, webp, heif and other animated images and play them
implementation("io.github.panpf.sketch4:sketch-animated:${LAST_VERSION}")

// [Android only] Use GifDrawable of the android-gif-drawable library to decode gif and play it
implementation("io.github.panpf.sketch4:sketch-animated-koralgif:${LAST_VERSION}")

// Support accessing compose resources through uri or placeholder, fallback, error, etc.
implementation("io.github.panpf.sketch4:sketch-compose-resources:${LAST_VERSION}")
implementation("io.github.panpf.sketch4:sketch-extensions-compose-resources:${LAST_VERSION}")

// Provides practical functions such as download progress, pausing loading during list scrolling, 
// saving cellular data, image type badge, loading apk icons and installed app icons, etc.
implementation("io.github.panpf.sketch4:sketch-extensions-compose:${LAST_VERSION}")
implementation("io.github.panpf.sketch4:sketch-extensions-view:${LAST_VERSION}")

// [JVM only] Supports using OkHttp to download images
implementation("io.github.panpf.sketch4:sketch-http-okhttp:${LAST_VERSION}")

// [JVM only] Supports using ktor to download images
implementation("io.github.panpf.sketch4:sketch-http-ktor:${LAST_VERSION}")

// Support SVG images
implementation("io.github.panpf.sketch4:sketch-svg:${LAST_VERSION}")

// [Android only] Use Android's built-in MediaMetadataRetriever class to decode video frames
implementation("io.github.panpf.sketch4:sketch-video:${LAST_VERSION}")

// [Android only] Decoding video frames using wseemann's FFmpegMediaMetadataRetriever library
implementation("io.github.panpf.sketch4:sketch-video-ffmpeg:${LAST_VERSION}")

Tip

  • sketch-compose, sketch-view Modules all depend on the singleton provided by the sketch-singleton module. If you don’t need the singleton, you can directly rely on their *-core version.
  • On Android sketch-compose and sketch-view can be used together

R8 / Proguard

Sketch itself does not need to configure any obfuscation rules, but you may need to configure it for the indirectly dependent Kotlin Coroutines, OkHttp, Okio Add obfuscation configuration

Quickly Started

Compose Multiplatform:

// val imageUri = "/Users/my/Downloads/image.jpg"
// val imageUri = "compose.resource://files/sample.png"
val imageUri = "https://www.sample.com/image.jpg"

AsyncImage(
    uri = imageUri,
    contentDescription = "photo"
)

AsyncImage(
    uri = imageUri,
    state = rememberAsyncImageState(ComposableImageOptions {
        placeholder(Res.drawable.placeholder)
        error(Res.drawable.error)
        crossfade()
        // There is a lot more...
    }),
    contentDescription = "photo"
)

AsyncImage(
    rqeuest = ComposableImageRequest(imageUri) {
        placeholder(Res.drawable.placeholder)
        error(Res.drawable.error)
        crossfade()
        // There is a lot more...
    },
    contentDescription = "photo"
)

Image(
    painter = rememberAsyncImagePainter(
        request = ComposableImageRequest(imageUri) {
            placeholder(Res.drawable.placeholder)
            error(Res.drawable.error)
            crossfade()
            // There is a lot more...
        }
    ),
    contentDescription = "photo"
)

Tip

placeholder(Res.drawable.placeholder) needs to import the sketch-compose-resources module

Android View:

// val imageUri = "/sdcard/download/image.jpg"
// val imageUri = "asset://image.jpg"
// val imageUri = "content://media/external/images/media/88484"
val imageUri = "https://www.sample.com/image.jpg"

imageView.loadImage(imageUri)

imageView.loadImage(imageUri) {
    placeholder(R.drawable.placeholder)
    error(R.drawable.error)
    crossfade()
    // There is a lot more...
}

val request = ImageRequest(context, imageUri) {
    placeholder(R.drawable.placeholder)
    error(R.drawable.error)
    crossfade()
    target(imageView)
    // There is a lot more...
}
context.sketch.enqueue(request)

For more information about Uri, image types, platform differences, Sketch customization, ImageRequest, etc., please view the 《Getting Started》 document

Documents

Basic functions:

Featured functions:

Change log

Please review the CHANGELOG.md file

About version 4.0

  • The maven groupId is upgraded to io.github.panpf.sketch4, so versions 2.* and 3.* will not prompt for upgrade
  • Version 4.0 is specially built for Compose Multiplatform, so there are many breaking changes in the API, please upgrade with caution
  • Version 4.0 has made a lot of simplifications and is much simpler than version 3.0, please check the update log for details
  • Android minimum API raised to API 21
  • Kotlin version upgraded to 2.0.0

Special thanks

Run source code

Prepare the environment:

  1. Android Studio: Koala+ (2024.1.1+)
  2. JDK: 17+
  3. Use kdoctor to check the running environment and follow the prompts to install the required software
  4. Android Studio installs the Kotlin Multiplatform and Compose Multiplatform IDE Supportplugins

Run the sample app:

  1. Clone the project and open it using Android Studio
  2. The running configurations of each platform have been added to the .run directory. After synchronization is completed, directly select the running configuration of the corresponding platform in the running configuration drop-down box at the top of Android Studio and click Run.
  3. The running configuration of the ios platform requires you to manually create it according to the template, as follows:
    1. Copy the .run/iosSample.run.template.xml file and remove the .template suffix. The .ignore file has been configured to ignore iosSample.run.xml
    2. Click Edit Configurations in the run configuration drop-down box at the top, select iosSample and then configure Execute target

My Projects

The following are my other open source projects. If you are interested, you can learn about them:

  • zoomimage: Library for zoom images, supported Android View, Compose and Compose Multiplatform; supported double-click zoom, One or two fingers gesture zoom, single-finger drag, inertial sliding, positioning, rotation, super-large image subsampling and other functions.
  • assembly-adapter: A library on Android that provides multi-type Item implementations for various adapters. Incidentally, it also provides the most powerful divider for RecyclerView.
  • sticky-item-decoration: RecyclerView sticky item implementation

License

Apache 2.0. See the LICENSE file for details.

sketch's People

Contributors

panpf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sketch's Issues

手势缩放问题

在开启手势缩放之后在列表中滑动的时候,划过几张图片之后手势缩放失效,并且在处于图片被手动缩小了之后再滑动过几张图片之后会导致所有图片都缩小了,然后手势缩放还失效了,就变不会来了,这是什么原因啊?我在列表中不开手势缩放到还没感觉出上面的问题

类型转换异常

Version release 2.4.1(2410)
09-01 18:23:28.234 7929-7929/com.eclite.activity W/Bundle: Key XG_V2_ACCESS_ID expected String but value was a java.lang.Integer. The default value was returned.
09-01 18:23:28.235 7929-7929/com.eclite.activity W/Bundle: Attempt to cast generated internal exception:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at android.os.BaseBundle.getString(BaseBundle.java:995)
at me.xiaopan.sketch.util.SketchUtils.findInitializer(SketchUtils.java:1240)
at me.xiaopan.sketch.Sketch.with(Sketch.java:69)
at me.xiaopan.sketch.viewfun.large.TileDecodeCallbackHandler.(TileDecodeCallbackHandler.java:51)
at me.xiaopan.sketch.viewfun.large.TileExecutor.(TileExecutor.java:50)
at me.xiaopan.sketch.viewfun.large.LargeImageViewer.(LargeImageViewer.java:69)
at me.xiaopan.sketch.viewfun.LargeImageFunction.(LargeImageFunction.java:49)
at me.xiaopan.sketch.viewfun.FunctionPropertyView.setBlockDisplayLargeImageEnabled(FunctionPropertyView.java:363)
at com.eclite.activity.ImageDetailActivityNew$ImagePagerAdapter.instantiateItem(ImageDetailActivityNew.java:419)
at com.eclite.activity.ImageDetailActivityNew$ImagePagerAdapter.instantiateItem(ImageDetailActivityNew.java:392)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1006)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1154)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1088)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614)
at android.view.View.measure(View.java:19867)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:19867)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19867)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19867)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
at android.view.View.measure(View.java:19867)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2336)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1427)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1680)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1315)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6420)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:876)
at android.view.Choreographer.doCallbacks(Choreographer.java:688)
at android.view.Choreographer.doFrame(Choreographer.java:623)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:862)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6165)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:785)

部分大图 放大后,有空白线

  1. 如示例里面的地图和黑圈,放大后,在部分切块交接边沿有空白线(有的手机看起来像黑线,有的手机看起来是透明的线,显示底下模糊背景)(看起来像是切片小了一个像素,放大到最大,或者缩小到最小就没有线)

  2. 示例里的微博长度,每块切片的加载时间,会越来越长,不断上下滑动,每次切片的时间会递增

Preview

how to show array of images into image preview

您好,DisplayRequest 184行有个打印日志的错误

printLogE("loadCompleted", "decode failed", "bitmap recycled", "bitmapInfo: " + 错误在loadResult.getGifDrawable().getInfo());

应该是
printLogE("loadCompleted", "decode failed", "bitmap recycled", "bitmapInfo: " + RecycleBitmapDrawable.getInfo(loadResult.getBitmap(), loadResult.getMimeType()));

宽高比

可以设置宽高比来显示图片吗

用最简单代码进行测试大图加载和阅读模式

Activity

public class MainActivity extends AppCompatActivity {

    private SketchImageView image;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        findViews();
        initViews();
    }

    private void findViews() {
        setContentView(R.layout.activity_main);
        image = (SketchImageView) findViewById(R.id.image);
    }

    private void initViews() {
        image.displayImage("http://appcdn.0315.cn/Uploads/20161022/580b173f378e4.jpg");
        image.setSupportZoom(true);
        image.setSupportLargeImage(true);
        ImageZoomer imageZoomer = image.getImageZoomer();
        imageZoomer.setReadMode(true);
    }
}

layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.iec_ts.test.MainActivity">

    <me.xiaopan.sketch.SketchImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

效果如下
screenshot_2016-10-22-21-28-49-012_cn iec_ts test
screenshot_2016-10-22-21-28-57-277_cn iec_ts test

是不是小的有啥东西没写,为啥我加载出来的长图没有分块,模模糊糊的,是不是什么地方配置错了?

在setSupportLargeImage为true情况下 滚动视图不刷新

代码是这样设置的

@Override
         public Object instantiateItem(ViewGroup view, final int position) {
            final SketchImageView imageView = new SketchImageView(browseImageActivity);
            imageView.setSupportLargeImage(true);
            imageView.setSupportZoom(true);
            imageView.displayImage(list.get(position));

            ViewGroup.LayoutParams layoutParams = new ViewPager.LayoutParams();
            view.addView(imageView, layoutParams);

            ImageZoomer zoomer = imageView.getImageZoomer();
            zoomer.setReadMode(true);
            zoomer.setOnViewLongPressListener(new ImageZoomer.OnViewLongPressListener() {
                @Override
                public void onViewLongPress(View view, float x, float y) {
                    browseImageActivity.popWindow.showAtLocation(LayoutInflater.from(browseImageActivity).inflate(R.layout.activity_main, null), Gravity.CENTER, 0, 0);
                }
            });

            return imageView;
        }

现象的视频发你邮箱([email protected])了 跪求解决

Bitmap:

How to get bitmap from sketch Image View. Please give me an answer.

加载图片的时候能设置header吗?

hi xiaopansky:
你的这个库非常好,但是我现在有一个问题,就是在加载图片的时候需要指定一个User-Agent, 我看了下你的文档好像是不支持。能否开放相关接口?

Crash issue

menu --- myphotos -- the third gif -- CRASH
my phone is HUAWEI Honor 8 lite base on Android 7.0

onComplete方法的监听不管用

我现在需要实现这样一个功能,在一个gif播放完以后播放另一个git,我在前一个gif的onComplete方法中调用播放第二个gif的代码,但是两个gif并没有实现先后播放,而是同时播放。多谢楼主!

Enhancement: Adding zooming feature

Hi,

First of all, thank you for the amazing library! I implemented it in my photoalbum app, it is working great now!

I have a suggestion for this library: Are you thinking of adding a zooming feature? I found this nice library - Scale Image View on Github for zooming images. What do you think?

滑动卡死

大图滑动、放大、缩小... 一些列操作后 (放大状态)会不响应滑动,点击设置并关闭对话框后可以;这时候双击缩小也可以

More zoom in SketchImageView

Hi,
I want to have more zoom in SketchImageView
I'm doing the code below but zoom doesn't change to 20f, but remain the default zoom

val photoView = SketchImageView(container.context)
photoView.isZoomEnabled = true
photoView.imageZoomer.zoom(20f)
photoView.options.setImageDisplayer(FadeInImageDisplayer())
photoView.displayImage("http://www.examplelink.com/example.jpg")

Image Thumbnail:

By default sketch image View does not use Exif to show thumbnail. how can i do this ? Because some devices have issues (like samsung j2)

图片变小的问题

近日加入新的工作组,图片加载方面用到了你的Sketch,我想用它的本意是支持Gif和图片加工等原因。不过在使用中,我遇到了如下问题。当我图片URL的地址不可用时,图片列表页面就会展示默认图,这没有问题。但是,假设点击图片Item进入到详情再返回至本页时默认图片就会很神奇的缩小到左上角一块。可能点击一张默认图片Item不会复现,可是多点击几个Item就会出现如上问题。如果您有空,请不吝解答一下。我的猜测是当加载默认图片drawable时,当加载多张旧图(缓存)时scaleType的设置有问题。谢谢。

占用内存过大 退出Activity不释放内存

举例:在Unsplash这个界面点击其中一张图进入单张浏览页面,一共有20张图,从第一张滑动到最后一张,APP占用内存增加了35兆以上(进入APP时占用31.31M,滑动完成后占用67.51M),在退出该Activity的时候不释放内存。其他的的页面看图片也是这样的

关于GaussianBlurImageProcessor用法

GaussianBlurImageProcessor make = GaussianBlurImageProcessor.make();
DisplayHelper helper = new DisplayHelper();
helper.processor(make);
小弟是这么写的,但是好像不对啊,求指教

gif & network layer

非常棒的图片加载库,但是看了下网络请求图片层用的是HttpClient实现的,考虑到Android后续已经不支持HttpClient,可否替换为其他类似okHTTP之类的加载;另外一个问题是,在加载gif动图的时候例如在列表中加载gif,并且设置都能动的情况,可否实现滚出屏幕之后动图能暂停,用户可见的时候,在继续播放这样的功能呢?

怎么加载网络图片

Sketch.with(context).download或者load方法拿到的result如何在SketchImageView中展示,示例只是说要先下载后加载,但是没有找到下载后怎么展示,多谢答主。

Rotate :

I have a image viewer app. i want to rotate image from portrait to landscape view & similarly rotate image from landscape to portrait. How to do that via sketch.

Provide a English version of the README.md

Hey, I'm Brazilian we speak portugese here, I saw your lib on Android Arsenal, but I dont know Chinese, can you provide at least a translated README.md file, I believe that a lot of people would use your lib.
Cya

Orientation Issue:

How to find out image orientation which is taken from default camera.

base64 图片加载问题

你好,我在使用本框架的时候,有用到 base64 加载图片,在使用中,发现文档有一处写错了,还请查看下是否存在此问题。
文档描述:
// display base64 image
sketchImageView.displayImage("data:image/jpeg;base,/9j/4QaO...U7T/in//Z");

源码中调用方式:
UriScheme 第 127 行:
return uri.substring(uri.indexOf(";") + ";base64,".length());

我目前使用方式,可以正确显示图片:
imageView.displayImage("data:image/jpeg;" + ";base64," + data.getImage());

如果用户调用文档的方式,控制台会显示 base64 解码错误,会让用户产生一个小误解,以为是 图片错误。请查看是否存在这个问题o( ̄︶ ̄)o

MissingFormatArgumentException: Format specifier: 3A

java.util.MissingFormatArgumentException: Format specifier: 3A
	at java.util.Formatter.getArgument(Formatter.java:1111)
	at java.util.Formatter.doFormat(Formatter.java:1076)
	at java.util.Formatter.format(Formatter.java:1042)
	at java.util.Formatter.format(Formatter.java:1011)
	at java.lang.String.format(String.java:1999)
	at java.lang.String.format(String.java:1973)
	at me.xiaopan.sketch.SLog.w(SLog.java:228)
	at me.xiaopan.sketch.SLog.w(SLog.java:241)
	at me.xiaopan.sketch.util.DiskLruCache.deleteContents(DiskLruCache.java:259)
	at me.xiaopan.sketch.util.DiskLruCache.delete(DiskLruCache.java:776)
	at me.xiaopan.sketch.util.DiskLruCache.open$51f85bc7(DiskLruCache.java:326)
	at me.xiaopan.sketch.cache.LruDiskCache.installDiskCache(LruDiskCache.java:115)
	at me.xiaopan.sketch.cache.LruDiskCache.get(LruDiskCache.java:165)
	at me.xiaopan.sketch.request.DownloadRequest.runDispatch(DownloadRequest.java:129)
	at me.xiaopan.sketch.request.LoadRequest.runDispatch(LoadRequest.java:160)
	at me.xiaopan.sketch.request.AsyncRequest.executeDispatch(AsyncRequest.java:62)
	at me.xiaopan.sketch.request.AsyncRequest.run(AsyncRequest.java:19)
	at me.xiaopan.sketch.request.RequestExecutor$DispatchCallback.handleMessage(RequestExecutor.java:186)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loop(Looper.java:193)
	at android.os.HandlerThread.run(HandlerThread.java:61)

发生版本:2.3.1
修复版本:将在下个版本2.3.2上修复

暂停下载

我只想单独暂停下载一张图片怎么办,比如我检测到一张图片非常大

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.