diff --git a/gyp/core.gypi b/gyp/core.gypi
index 58d9899..95d44f2 100644
--- a/gyp/core.gypi
+++ b/gyp/core.gypi
@@ -165,6 +165,7 @@
         '<(skia_src_path)/core/SkPictureShader.cpp',
         '<(skia_src_path)/core/SkPictureShader.h',
         '<(skia_src_path)/core/SkPixelRef.cpp',
+        '<(skia_src_path)/core/SkPixelSerializer.cpp',
         '<(skia_src_path)/core/SkPixmap.cpp',
         '<(skia_src_path)/core/SkPoint.cpp',
         '<(skia_src_path)/core/SkPoint3.cpp',
diff --git a/include/core/SkImageEncoder.h b/include/core/SkImageEncoder.h
index fc999dc..5fa69f7 100644
--- a/include/core/SkImageEncoder.h
+++ b/include/core/SkImageEncoder.h
@@ -13,6 +13,8 @@
 
 class SkBitmap;
 class SkData;
+class SkPixmap;
+class SkPixelSerializer;
 class SkWStream;
 
 class SkImageEncoder {
@@ -60,8 +62,11 @@
      */
     bool encodeStream(SkWStream* stream, const SkBitmap& bm, int quality);
 
+    SkPixelSerializer* refSerializer();
+
     static SkData* EncodeData(const SkImageInfo&, const void* pixels, size_t rowBytes,
                               Type, int quality);
+    static SkData* EncodeData(const SkPixmap&, Type, int quality);
     static SkData* EncodeData(const SkBitmap&, Type, int quality);
 
     static bool EncodeFile(const char file[], const SkBitmap&, Type,
@@ -69,6 +74,12 @@
     static bool EncodeStream(SkWStream*, const SkBitmap&, Type,
                            int quality);
 
+    /**
+     *  If the existing data can be re-encoded into the specified type (efficiently), this
+     *  returns that new data (which the caller must unref()). If not, this returns null.
+     */
+    static SkData* ReencodeData(SkData* encoded, Type);
+
 protected:
     /**
      * Encode bitmap 'bm' in the desired format, writing results to
@@ -78,6 +89,8 @@
      * This must be overridden by each SkImageEncoder implementation.
      */
     virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) = 0;
+
+    virtual SkData* onReencodeData(SkData*) { return nullptr; }
 };
 
 // This macro declares a global (i.e., non-class owned) creation entry point
diff --git a/include/core/SkPixelSerializer.h b/include/core/SkPixelSerializer.h
index d089209..4ac5253 100644
--- a/include/core/SkPixelSerializer.h
+++ b/include/core/SkPixelSerializer.h
@@ -8,9 +8,10 @@
 #ifndef SkPixelSerializer_DEFINED
 #define SkPixelSerializer_DEFINED
 
+#include "SkData.h"
+#include "SkPixmap.h"
 #include "SkRefCnt.h"
 
-class SkData;
 struct SkImageInfo;
 
 /**
@@ -18,35 +19,38 @@
  */
 class SkPixelSerializer : public SkRefCnt {
 public:
-    virtual ~SkPixelSerializer() {}
-
     /**
-     *  Call to determine if the client wants to serialize the encoded data. If
-     *  false, serialize another version (e.g. the result of encodePixels).
+     *  Call to determine if the client wants to serialize the encoded data.
+     *
+     *  If the encoded data is can be re-encoded (or taken as is), this returns a ref to a data
+     *  with the result, which the caller must unref() when they are through. The returned
+     *  data may be the same as the input, or it may be different, but either way the caller is
+     *  responsible for calling unref() on it.
+     *
+     *  If the encoded data is not acceptable to this pixel serializer, this returns NULL.
      */
-    bool useEncodedData(const void* data, size_t len) {
-        return this->onUseEncodedData(data, len);
-    }
+    SkData* reencodeData(SkData* encoded);
 
     /**
      *  Call to get the client's version of encoding these pixels. If it
      *  returns NULL, serialize the raw pixels.
      */
-    SkData* encodePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes) {
-        return this->onEncodePixels(info, pixels, rowBytes);
+    SkData* encodePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes);
+
+    /**
+     *  Call to get the client's version of encoding these pixels. If it
+     *  returns NULL, serialize the raw pixels.
+     */
+    SkData* encodePixels(const SkPixmap& pixmap);
+    
+protected:
+    // DEPRECATED -- this is no longer called, so remove from your subclasses!
+    virtual bool onUseEncodedData(const void*, size_t) { return true; }
+
+    virtual SkData* onReencodeData(SkData* encoded) {
+        return SkRef(encoded);
     }
 
-protected:
-    /**
-     *  Return true if you want to serialize the encoded data, false if you want
-     *  another version serialized (e.g. the result of encodePixels).
-     */
-    virtual bool onUseEncodedData(const void* data, size_t len) = 0;
-
-    /**
-     *  If you want to encode these pixels, return the encoded data as an SkData
-     *  Return null if you want to serialize the raw pixels.
-     */
     virtual SkData* onEncodePixels(const SkImageInfo&, const void* pixels, size_t rowBytes) = 0;
 };
 #endif // SkPixelSerializer_DEFINED
diff --git a/src/core/SkPixelSerializer.cpp b/src/core/SkPixelSerializer.cpp
new file mode 100644
index 0000000..a694bbe
--- /dev/null
+++ b/src/core/SkPixelSerializer.cpp
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkPixelSerializer.h"
+
+SkData* SkPixelSerializer::reencodeData(SkData* encoded) {
+    return encoded ? this->onReencodeData(encoded) : nullptr;
+}
+
+SkData* SkPixelSerializer::encodePixels(const SkImageInfo& info, const void* pixels,
+                                        size_t rowBytes) {
+    if (kUnknown_SkColorType == info.colorType() || !pixels) {
+        return nullptr;
+    }
+    return this->onEncodePixels(info, pixels, rowBytes);
+}
+
+SkData* SkPixelSerializer::encodePixels(const SkPixmap& pixmap) {
+    return this->encodePixels(pixmap.info(), pixmap.addr(), pixmap.rowBytes());
+}
diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp
index 1dfe0b3..1799df1 100644
--- a/src/core/SkWriteBuffer.cpp
+++ b/src/core/SkWriteBuffer.cpp
@@ -186,13 +186,15 @@
     SkPixelRef* pixelRef = bitmap.pixelRef();
     if (pixelRef) {
         // see if the pixelref already has an encoded version
-        SkAutoDataUnref existingData(pixelRef->refEncodedData());
-        if (existingData.get() != nullptr) {
+        SkAutoDataUnref encodedData(pixelRef->refEncodedData());
+        if (encodedData) {
             // Assumes that if the client did not set a serializer, they are
             // happy to get the encoded data.
-            if (!fPixelSerializer || fPixelSerializer->useEncodedData(existingData->data(),
-                                                                      existingData->size())) {
-                write_encoded_bitmap(this, existingData, bitmap.pixelRefOrigin());
+            if (fPixelSerializer) {
+                encodedData.reset(fPixelSerializer->reencodeData(encodedData));
+            }
+            if (encodedData) {
+                write_encoded_bitmap(this, encodedData, bitmap.pixelRefOrigin());
                 return;
             }
         }
@@ -200,12 +202,9 @@
         // see if the caller wants to manually encode
         SkAutoPixmapUnlock result;
         if (fPixelSerializer && bitmap.requestLock(&result)) {
-            const SkPixmap& pmap = result.pixmap();
             SkASSERT(nullptr == fBitmapHeap);
-            SkAutoDataUnref data(fPixelSerializer->encodePixels(pmap.info(),
-                                                                pmap.addr(),
-                                                                pmap.rowBytes()));
-            if (data.get() != nullptr) {
+            SkAutoDataUnref data(fPixelSerializer->encodePixels(result.pixmap()));
+            if (data) {
                 // if we have to "encode" the bitmap, then we assume there is no
                 // offset to share, since we are effectively creating a new pixelref
                 write_encoded_bitmap(this, data, SkIPoint::Make(0, 0));
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index ee76a7e..240c06e 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -74,6 +74,14 @@
 }
 
 SkData* SkImage::encode(SkImageEncoder::Type type, int quality) const {
+    SkAutoDataUnref encoded(this->refEncoded());
+    if (encoded) {
+        SkAutoDataUnref reencoded(SkImageEncoder::ReencodeData(encoded, type));
+        if (reencoded) {
+            return reencoded.detach();
+        }
+    }
+
     SkBitmap bm;
     if (as_IB(this)->getROPixels(&bm)) {
         return SkImageEncoder::EncodeData(bm, type, quality);
@@ -85,10 +93,6 @@
 
 class DefaultSerializer :  public SkPixelSerializer {
 protected:
-    bool onUseEncodedData(const void *data, size_t len) override {
-        return true;
-    }
-
     SkData* onEncodePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes) override {
         return SkImageEncoder::EncodeData(info, pixels, rowBytes, SkImageEncoder::kPNG_Type, 100);
     }
@@ -101,15 +105,17 @@
     SkPixelSerializer* effectiveSerializer = serializer ? serializer : &defaultSerializer;
 
     SkAutoTUnref<SkData> encoded(this->refEncoded());
-    if (encoded && effectiveSerializer->useEncodedData(encoded->data(), encoded->size())) {
-        return encoded.detach();
+    if (encoded) {
+        encoded.reset(effectiveSerializer->reencodeData(encoded));
+        if (encoded) {
+            return encoded.detach();
+        }
     }
 
     SkBitmap bm;
     SkAutoPixmapUnlock apu;
     if (as_IB(this)->getROPixels(&bm) && bm.requestLock(&apu)) {
-        const SkPixmap& pmap = apu.pixmap();
-        return effectiveSerializer->encodePixels(pmap.info(), pmap.addr(), pmap.rowBytes());
+        return effectiveSerializer->encodePixels(apu.pixmap());
     }
 
     return nullptr;
diff --git a/src/images/SkImageDecoder_ktx.cpp b/src/images/SkImageDecoder_ktx.cpp
index a95ab6f..f903b3f 100644
--- a/src/images/SkImageDecoder_ktx.cpp
+++ b/src/images/SkImageDecoder_ktx.cpp
@@ -252,34 +252,40 @@
 class SkKTXImageEncoder : public SkImageEncoder {
 protected:
     bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality) override;
+    SkData* onReencodeData(SkData*) override;
 
 private:
     virtual bool encodePKM(SkWStream* stream, const SkData *data);
     typedef SkImageEncoder INHERITED;
 };
 
+SkData* SkKTXImageEncoder::onReencodeData(SkData* encoded) {
+    const uint8_t* bytes = encoded->bytes();
+    if (etc1_pkm_is_valid(bytes)) {
+        SkDynamicMemoryWStream stream;
+        if (this->encodePKM(&stream, encoded)) {
+            return stream.copyToData();
+        }
+    }
+    // Is it a KTX file??
+    if (SkKTXFile::is_ktx(bytes)) {
+        return SkRef(encoded);
+    }
+    return nullptr;
+}
+
 bool SkKTXImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bitmap, int) {
     if (!bitmap.pixelRef()) {
         return false;
     }
-    SkAutoDataUnref data(bitmap.pixelRef()->refEncodedData());
 
-    // Is this even encoded data?
-    if (data) {
-        const uint8_t *bytes = data->bytes();
-        if (etc1_pkm_is_valid(bytes)) {
-            return this->encodePKM(stream, data);
+    SkAutoDataUnref encoded(bitmap.pixelRef()->refEncodedData());
+    if (encoded) {
+        SkAutoDataUnref reencoded(this->onReencodeData(encoded));
+        if (reencoded) {
+            return stream->write(reencoded->bytes(), reencoded->size());
         }
-
-        // Is it a KTX file??
-        if (SkKTXFile::is_ktx(bytes)) {
-            return stream->write(bytes, data->size());
-        }
-        
-        // If it's neither a KTX nor a PKM, then we need to
-        // get at the actual pixels, so fall through and decompress...
     }
-
     return SkKTXFile::WriteBitmapToKTX(stream, bitmap);
 }
 
diff --git a/src/images/SkImageEncoder.cpp b/src/images/SkImageEncoder.cpp
index cc1b73b..4ad12c8 100644
--- a/src/images/SkImageEncoder.cpp
+++ b/src/images/SkImageEncoder.cpp
@@ -60,3 +60,13 @@
     SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t));
     return enc.get() ? enc.get()->encodeData(bm, quality) : nullptr;
 }
+
+SkData* SkImageEncoder::EncodeData(const SkPixmap& pmap, Type t, int quality) {
+    return EncodeData(pmap.info(), pmap.addr(), pmap.rowBytes(), t, quality);
+}
+
+SkData* SkImageEncoder::ReencodeData(SkData* encoded, Type t) {
+    SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t));
+    return enc.get() ? enc.get()->onReencodeData(encoded) : nullptr;
+}
+
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index 0b27af9..e022077 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -119,8 +119,8 @@
     bool didEncode() const { return fDidEncode; }
 
 protected:
-    bool onUseEncodedData(const void*, size_t) override {
-        return false;
+    SkData* onReencodeData(SkData*) override {
+        return nullptr;
     }
 
     SkData* onEncodePixels(const SkImageInfo&, const void*, size_t) override {
diff --git a/tests/KtxTest.cpp b/tests/KtxTest.cpp
index e0d9a27..0ad2496 100644
--- a/tests/KtxTest.cpp
+++ b/tests/KtxTest.cpp
@@ -8,6 +8,7 @@
 #include "Resources.h"
 #include "SkBitmap.h"
 #include "SkData.h"
+#include "SkImage.h"
 #include "SkImageGenerator.h"
 #include "SkForceLinking.h"
 #include "SkImageDecoder.h"
@@ -149,14 +150,11 @@
         return;
     }
 
-    bool installDiscardablePixelRefSuccess =
-        SkDEPRECATED_InstallDiscardablePixelRef(fileData, &etcBitmap);
-    REPORTER_ASSERT(reporter, installDiscardablePixelRefSuccess);
+    SkAutoTUnref<SkImage> image(SkImage::NewFromEncoded(fileData));
+    REPORTER_ASSERT(reporter, image.get());
 
-    // Write the bitmap out to a KTX file.
-    SkData *ktxDataPtr = SkImageEncoder::EncodeData(etcBitmap, SkImageEncoder::kKTX_Type, 0);
-    SkAutoDataUnref newKtxData(ktxDataPtr);
-    REPORTER_ASSERT(reporter, ktxDataPtr);
+    SkAutoDataUnref newKtxData(image->encode(SkImageEncoder::kKTX_Type, 0));
+    REPORTER_ASSERT(reporter, newKtxData.get());
 
     // See is this data is identical to data in existing ktx file.
     SkString ktxFilename = GetResourcePath("mandrill_128.ktx");
diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h
index b20c60b..d8709cc 100644
--- a/tools/sk_tool_utils.h
+++ b/tools/sk_tool_utils.h
@@ -115,7 +115,6 @@
     // used.
     class PngPixelSerializer : public SkPixelSerializer {
     public:
-        bool onUseEncodedData(const void*, size_t) override { return true; }
         SkData* onEncodePixels(const SkImageInfo& info, const void* pixels,
                                size_t rowBytes) override {
             return SkImageEncoder::EncodeData(info, pixels, rowBytes,
