diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Changelog for ktx-codec
 
+## [0.0.1.2] - 2021-01-18
+
+* Add `fromByteString`
+
+[0.0.1.2]: https://gitlab.com/dpwiz/ktx/-/tree/v0.0.1.2-codec
+
 ## [0.0.1.1] - 2020-08-24
 
 * Debug traces removed.
diff --git a/ktx-codec.cabal b/ktx-codec.cabal
--- a/ktx-codec.cabal
+++ b/ktx-codec.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b3d919b1cb108455f9f11c9c1d401b54550721d77b0af43ef70d021927dd3bf3
+-- hash: 90f4385af1027f93ec529bb24d6a8c8435eb753ead4b549c7885a3b1005e21b6
 
 name:           ktx-codec
-version:        0.0.1.1
+version:        0.0.1.2
 synopsis:       Khronos texture format
 description:    KTX is a format for storing textures for OpenGL® and OpenGL® ES applications.
                 It is distinguished by the simplicity of the loader required to instantiate a
diff --git a/src/Codec/Ktx.hs b/src/Codec/Ktx.hs
--- a/src/Codec/Ktx.hs
+++ b/src/Codec/Ktx.hs
@@ -1,6 +1,6 @@
 module Codec.Ktx where
 
-import Data.Binary (Binary(..), decodeFileOrFail)
+import Data.Binary (Binary(..), decodeFileOrFail, decodeOrFail)
 import Data.Binary.Get (Get, ByteOffset, getWord32le, getWord32be, getByteString, skip)
 import Data.Binary.Put (Put, putByteString, putWord32le)
 import Data.ByteString (ByteString)
@@ -16,6 +16,15 @@
 import qualified Data.Map.Strict as Map
 import qualified Data.Vector as Vector
 import qualified Data.ByteString as BS
+import qualified Data.ByteString.Lazy as BSL
+
+fromByteString :: ByteString -> Either (ByteOffset, String) Ktx
+fromByteString bs =
+  case decodeOrFail (BSL.fromStrict bs) of
+    Right (_leftovers, _bytesLeft, ktx) ->
+      Right ktx
+    Left (_leftovers, bytesLeft, err) ->
+      Left (bytesLeft, err)
 
 fromFile :: FilePath -> IO (Either (ByteOffset, String) Ktx)
 fromFile = decodeFileOrFail
