diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp
index 0d009b3..4422334 100644
--- a/debugger/QT/SkDebuggerGUI.cpp
+++ b/debugger/QT/SkDebuggerGUI.cpp
@@ -281,9 +281,8 @@
     SkFILEWStream file(filename.c_str());
     SkAutoTUnref<SkPicture> copy(fDebugger.copyPicture());
 
-    SkAutoTUnref<SkPixelSerializer> serializer(
-            SkImageEncoder::CreatePixelSerializer());
-    copy->serialize(&file, serializer);
+    sk_tool_utils::PngPixelSerializer serializer;
+    copy->serialize(&file, &serializer);
 }
 
 void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
diff --git a/include/core/SkImageEncoder.h b/include/core/SkImageEncoder.h
index bb3341f..fc999dc 100644
--- a/include/core/SkImageEncoder.h
+++ b/include/core/SkImageEncoder.h
@@ -12,8 +12,6 @@
 #include "SkTRegistry.h"
 
 class SkBitmap;
-class SkPixelSerializer;
-class SkPixmap;
 class SkData;
 class SkWStream;
 
@@ -66,17 +64,11 @@
                               Type, int quality);
     static SkData* EncodeData(const SkBitmap&, Type, int quality);
 
-    static SkData* EncodeData(const SkPixmap&, Type, int quality);
-
     static bool EncodeFile(const char file[], const SkBitmap&, Type,
                            int quality);
     static bool EncodeStream(SkWStream*, const SkBitmap&, Type,
                            int quality);
 
-    /** Uses SkImageEncoder to serialize images that are not already
-        encoded as SkImageEncoder::kPNG_Type images. */
-    static SkPixelSerializer* CreatePixelSerializer();
-
 protected:
     /**
      * Encode bitmap 'bm' in the desired format, writing results to
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 338ab09..7db5b4e 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -9,7 +9,6 @@
 #include "SkBitmapCache.h"
 #include "SkCanvas.h"
 #include "SkData.h"
-#include "SkImageEncoder.h"
 #include "SkImageGenerator.h"
 #include "SkImagePriv.h"
 #include "SkImageShader.h"
@@ -179,14 +178,32 @@
     return nullptr;
 }
 
-SkData* SkImage::encode(SkPixelSerializer* serializer) const {
-    SkAutoTUnref<SkPixelSerializer> defaultSerializer;
-    SkPixelSerializer* effectiveSerializer = serializer;
-    if (!effectiveSerializer) {
-        defaultSerializer.reset(SkImageEncoder::CreatePixelSerializer());
-        SkASSERT(defaultSerializer.get());
-        effectiveSerializer = defaultSerializer.get();
+namespace {
+
+class DefaultSerializer :  public SkPixelSerializer {
+protected:
+    bool onUseEncodedData(const void *data, size_t len) override {
+        return true;
     }
+    SkData* onEncode(const SkPixmap& pixmap) override {
+        SkBitmap bm;
+        if (!bm.installPixels(pixmap.info(),
+                              const_cast<void*>(pixmap.addr()),
+                              pixmap.rowBytes(),
+                              pixmap.ctable(),
+                              nullptr, nullptr)) {
+            return nullptr;
+        }
+        return SkImageEncoder::EncodeData(bm, SkImageEncoder::kPNG_Type, 100);
+    }
+};
+
+} // anonymous namespace
+
+SkData* SkImage::encode(SkPixelSerializer* serializer) const {
+    DefaultSerializer defaultSerializer;
+    SkPixelSerializer* effectiveSerializer = serializer ? serializer : &defaultSerializer;
+
     SkAutoTUnref<SkData> encoded(this->refEncoded());
     if (encoded && effectiveSerializer->useEncodedData(encoded->data(), encoded->size())) {
         return encoded.detach();
diff --git a/src/images/SkImageEncoder.cpp b/src/images/SkImageEncoder.cpp
index cea5678..cc1b73b 100644
--- a/src/images/SkImageEncoder.cpp
+++ b/src/images/SkImageEncoder.cpp
@@ -7,8 +7,6 @@
 
 #include "SkImageEncoder.h"
 #include "SkBitmap.h"
-#include "SkPixelSerializer.h"
-#include "SkPixmap.h"
 #include "SkStream.h"
 #include "SkTemplates.h"
 
@@ -59,33 +57,6 @@
     if (!bm.installPixels(info, const_cast<void*>(pixels), rowBytes)) {
         return nullptr;
     }
-    bm.setImmutable();
-    return SkImageEncoder::EncodeData(bm, t, quality);
-}
-
-SkData* SkImageEncoder::EncodeData(const SkPixmap& pixmap,
-                                   Type t, int quality) {
-    SkBitmap bm;
-    if (!bm.installPixels(pixmap.info(),
-                          const_cast<void*>(pixmap.addr()),
-                          pixmap.rowBytes(),
-                          pixmap.ctable(), nullptr, nullptr)) {
-        return nullptr;
-    }
-    bm.setImmutable();
-    return SkImageEncoder::EncodeData(bm, t, quality);
-}
-
-namespace {
-class ImageEncoderPixelSerializer final : public SkPixelSerializer {
-protected:
-    bool onUseEncodedData(const void*, size_t) override { return true; }
-    SkData* onEncode(const SkPixmap& pmap) override {
-        return SkImageEncoder::EncodeData(pmap, SkImageEncoder::kPNG_Type, 100);
-    }
-};
-} // namespace
-
-SkPixelSerializer* SkImageEncoder::CreatePixelSerializer() {
-    return new ImageEncoderPixelSerializer;
+    SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t));
+    return enc.get() ? enc.get()->encodeData(bm, quality) : nullptr;
 }
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index a81733e..1575456 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -851,9 +851,8 @@
     SkAutoTUnref<SkPicture> picture(recorder.endRecording());
 
     SkDynamicMemoryWStream wStream;
-    SkAutoTUnref<SkPixelSerializer> serializer(
-            SkImageEncoder::CreatePixelSerializer());
-    picture->serialize(&wStream, serializer);
+    sk_tool_utils::PngPixelSerializer serializer;
+    picture->serialize(&wStream, &serializer);
     return wStream.copyToData();
 }
 
diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h
index dab42e3..67fd869 100644
--- a/tools/sk_tool_utils.h
+++ b/tools/sk_tool_utils.h
@@ -114,6 +114,18 @@
     SkBitmap create_string_bitmap(int w, int h, SkColor c, int x, int y,
                                   int textSize, const char* str);
 
+    // Encodes to PNG, unless there is already encoded data, in which case that gets
+    // 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,
+                                              SkImageEncoder::kPNG_Type, 100);
+        }
+    };
+
     // A helper for inserting a drawtext call into a SkTextBlobBuilder
     void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkPaint& origPaint,
                           SkScalar x, SkScalar y);
