ピクセル データを配列として取得する場合は、 を使用ImageIO.read()
して を取得してBufferedImage
から、 を使用BufferedImage.getRaster().getDataBuffer()
して を取得できますDataBuffer
。そこから、BufferedImage
をキャストする方法を決定するために、のタイプを確認する必要がありますDataBuffer
。たとえば、TYPE_INT_RGB
画像がある場合は、にキャストする必要があり、データを含むDataBufferInt
を呼び出しDataBufferInt.getData()
て取得できint[]
ます。BufferedImage
この方法で得られるのはコピーではありません。.
ただし、これには大きな注意点がありImageIO.read()
ます。多くの場合、必要なタイプの画像が得られません。たとえば、TYPE_CUSTOM を取得することがよくありますが、実際に必要なイメージ タイプにコピーする以外には何も役に立ちません。
そのImageIO.read()
ため、幸運にも必要なImageIO.read()
形式の画像が得られる場合にのみ、2 番目のコピーを作成せずに画像データを取得することができます。から利用可能なタイプを確認したい場合はImageIO
、 を呼び出しImageIO.getImageReaders()
てIterator
、ストリームを読み取ることができると主張するすべてのリーダーを取得し、 を使用して、リーダーが読み取ることができる画像タイプをImageReader.getImageTypes(0)
取得できます。Iterator
このようにして、必要な画像タイプを提供するリーダーを見つけるかもしれませんが、息を止めないでください。
画像が巨大でない限り、コピーは実際にはかなり高速です。ただし、画像が巨大な場合は、生の画像データを一度に1行ずつディスクに書き込むために使用する必要があるかもしれませんBufferedImage.getRGB()
(ただし、圧縮して、 a を使用しますGZIPOutputStream
)、元の画像をガベージコレクションし、新しいを作成しますBufferedImage
最後にディスクから行を読み戻し、 を使用してそれらを新しいイメージに書き込みますBufferedImage.setRGB()
。(私はほんの数日前にこれを行うために何かを書いたので、詳細はかなり新鮮です。そのための LGPL のソースはここにあります。)