19

プラットフォーム SDK のみを使用して、ビットマップをメモリ内の PNG に変換できますか (つまり、ファイルに書き込む必要はありません)? (つまり、libpng などはありません)。

また、この画像の透明色 (アルファ チャネルではない) を定義できるようにしたいと考えています。

GdiPlus ソリューションは、幅が 4 で割り切れる画像に限定されているようです。Save() の呼び出し中は、それ以外はすべて失敗します。この制限の理由と、それを回避する方法/回避策を知っている人はいますか?

更新: バウンティ

報奨金を開始しています (これが機能することを本当に望んでいます)。GDI+ ソリューションを実装しましたが、前述したように、クワッド幅の画像に限定されます。この賞金は、この幅の問題を (画像のサイズを変更せずに) 解決できる人、または機能する代替の非 GDI+ ソリューションを提供できる人に贈られます。

4

8 に答える 8

20

LodePNG ( GitHub ) は lib-less PNG エンコーダー/デコーダーです。

于 2009-02-14T19:31:05.200 に答える
15

私はlibpngを使用して PNG を読み書きしますが、それは私が投げたものすべてを処理するようです (257x255 画像などの単体テストで使用しましたが、問題はありません)。APIはファイル I/O に縛られないほど柔軟であると思います (または、少なくともデフォルトの動作をオーバーライドできます。たとえば、カスタマイズのセクションを参照png_set_write_fnください) 。

実際には、私は常によりクリーンなboost::gil PNG IO extensionを介してそれを使用しますが、残念ながらそれはchar*ファイル名を取り、それを掘り下げるとpng_writerfile_mgrその実装のクラスはかなり関連しているように見えFILE*ます(ただし、Linux を使用しているバージョンを使用している場合fmemopen とメモリ内バッファは、おそらく非常に簡単に作成できます)。

于 2009-02-11T20:57:32.147 に答える
12

このサイトのコードは、ビットマップを PNG に変換してファイルに書き込む方法を示しています: http://dotnet-snippets.de/dns/gdi-speichern-eines-png-SID814.aspx。ファイルへの書き込みの代わりに、SaveBitmap のメソッドはIStream( http://msdn.microsoft.com/en-us/library/ms535406%28VS.85%29.aspx ) への書き込みもサポートしています。CreateStreamOnHGlobalAPI関数を使用して、メモリバックアップされたストリームを作成できます。( http://msdn.microsoft.com/en-us/library/aa378980%28VS.85%29.aspx )。使用するライブラリ GDI+ は、WindowsXP 以降の Windows に含まれ、Windows98 以降の Windows で動作します。私はそれで何かをしたことはありません。でも使えそうですよね。

于 2008-12-14T17:54:49.613 に答える
8

CImage クラス (ATL/MFC) は、PNG 形式への保存をサポートしています。GDI+ ソリューションと同様に、ストリームへの保存もサポートしています。これを CByteArray に保存するために使用するコードを次に示します。

CByteArray baPicture;
IStream *pStream = NULL;
if (CreateStreamOnHGlobal(NULL, TRUE, &pStream) == S_OK)
{
    if (image.Save(pStream, Gdiplus::ImageFormatPNG) == S_OK)
    {
    ULARGE_INTEGER ulnSize;
        LARGE_INTEGER lnOffset;
        lnOffset.QuadPart = 0;
        if (pStream->Seek(lnOffset, STREAM_SEEK_END, &ulnSize) == S_OK)
        {
            if (pStream->Seek(lnOffset, STREAM_SEEK_SET, NULL) == S_OK)
            {                       
                baPicture.SetSize(ulnSize.QuadPart);
                ULONG ulBytesRead;
                pStream->Read(baPicture.GetData(), ulnSize.QuadPart, &ulBytesRead);
            }
        }
    }
}
pStream->Release();

ただし、ATL と MFC のどちらを使用するかはわかりません。

于 2009-02-12T10:40:09.207 に答える
6

ビットマップをPNGとしてファイルに保存するためにGDI +を使用しました。おそらく、GDI+ に関する MSDN 情報を確認する必要があります。特に、この関数GdipSaveImageToStreamを確認してください。

このチュートリアルは、おそらくいくつかのヘルプも提供します

于 2008-12-14T18:38:26.920 に答える
5

GDI (古い学校、非プラス) には、 PNG 圧縮 ( == )GetDIBitsを使用してビットを出力するように要求できる方法があります。これを使ってPNGファイルを作成できるのだろうか?標準のビットマップ ファイルを作成するのは非常に複雑なので、これはさらに難しいと思います。BITMAPINFOHEADER::biCompressionBI_PNGGetDIBits

于 2009-02-11T19:57:51.497 に答える
3

Windows API のみを使用する場合は、WICがこれを実現する方法であり、ビットマップと PNG の両方をサポートしています。

于 2009-02-12T03:34:06.903 に答える
2

自分で車輪を再発明するのではなく、ライブラリを使用する方がおそらく良いでしょう。

freeImageを調べる

于 2008-12-14T17:51:11.553 に答える