2009-07-04 5 views
1

私はTStreamとして関数に受け取った画像を操作しようとしています。 私はそれをメモリからロードし、ファイルへの書き込みを避けたいと思います。次のように私が行う機能でOpenIL(DevIL):DelphiのilLoadLを使用

imgLump: Array of TILubyte; 

:この時

// setting input image into a "lump" 
SetLength(imgLump, inImage.Size); 
// rewind stream to beginning 
inImage.Seek(0, soBeginning); 
// read stream and write into array 
inImage.Read(imgLump[0], inImage.Size); 
loaded := ilLoadL(IL_JPG, imgLump, Length(imgLump)); 

のように宣言 "しこり" 変数

inImage: TStream; 

:として宣言

入力変数ステージ、ロードされた値0(IL_FALSE)、ilGetError()を呼び出すと1298(IL_FILE_READ_ERROR)が返されます。

なぜですか?私は何を取りこぼしたか?

ステップ1:ファイルにストリームを書くとしようと問題が解決しない場合は、これを試して

loaded := ilLoadL(IL_JPG, @imgLump[0], Length(imgLump)); 

おかげで、 宜蘭

答えて

0

まずこれを試してくださいお気に入りの画像ビューアを使用して開きます。

それは動作しません、ストリーム自体が壊れています。

手順2:ファイルに配列を書き込んで確認します。

それは動作しません、ストリームへの配列は間違っています。

ステップ3:すべてのファイルが有効な場合は、ilLoadLの呼び出しで問題が発生している必要があります。ドキュメンテーションを再確認し、元の開発者に相談してください。

+0

間違いなく。しかし、おそらく@imgLump [0]。 –

+0

配列が連続ブロックであるため、これら2つの間に違いはありません。そのため、このアサーションは有効です:@array = @array [Low(array)]、つまり、両方のポインタがメモリ内の同じアドレスを指しています。 –

+0

私は疑いがありましたが、分解を確認しました。それは間違いなく同じです:) –

1

私はストリームで探しません。ほとんどのAPIは、ストリームが与えられたときに、正しい読み込み先が現在の位置であると仮定して書かれています。彼らは、彼らが望むだけ多くのデータを読み込んで、その位置にストリームを残して、次の機能がストリームを読み続ける準備ができているはずです。ストリーム全体があなたのものであると仮定してはいけません。発信者は事前に他のものを持っているかもしれません。または、ストリームが後ろ向きの検索や検索をサポートしていない可能性があります。

ストリームにJPEGデータが含まれていますか?最初の数バイトはどのように見えるのですか?代わりにTJpegImageで画像を開こうとしましたか?

TILubyteは通常のByteと同じですか? DevILは、他の誰もが普通の配列やメモリバッファと呼んでいるものと同じように「塊」を呼んでいますか?

+0

私はそれを考慮に入れます。とにかく、今回は関数と呼び出し元の両方を制御するので、ストリーム内の内容を正確に把握しています。ファイルベースのソリューション(他の読み込み機能)はスムーズに動作します。 私は非標準の用語を発明しませんでした...私はここから取った:http://openil.sourceforge.net/tuts/tut_5/index.htm 私は理解するために、彼は標準的な配列を使用しています。 TILuByteはByteとして定義されています。 –

関連する問題