問題タブ [bufferedimage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
12093 参照

java - Java:BufferedImageのピクセルの高速コピーを行う方法は? (単体テスト含む)

BufferedImagesource からdestination への ARGB 値の (長方形領域の) コピーを実行したいと考えていますBufferedImage。合成は行わないでください。ARGB 値が 0x8000BE50 (アルファ値は 128) のピクセルをコピーする場合、コピー先ピクセルは正確に0x8000BE50 である必要があり、コピー先ピクセルを完全にオーバーライドします。

非常に正確な質問があり、必要なものを示すために単体テストを作成しました。単体テストは完全に機能し、自己完結型であり、問​​題なく合格しており、まさに私が望んでいることを行っています。

ただし、copySrcIntoDstAt (...)を置き換えるには、より高速でメモリ効率の高い方法が必要です。

それが私の質問の要点です。私は、画像をより速く「塗りつぶす」方法を求めていません(私が行ったことは、単体テストを行うための単なる例です)。私が望むのは、それを行うための高速でメモリ効率の良い方法 (つまり、高速で不要なオブジェクトを作成しない方法) を知ることだけです。

私が作成した概念実証の実装は、明らかにメモリ効率が非常に高いですが、低速です (すべてのピクセルに対して1getRGBつと 1 つを実行します)。setRGB

概略的に、私はこれを持っています: (ここで、A はコピー前のコピー先画像からの対応するピクセルを示します)

そして、私はこれが欲しい:

ここで、「B」はsrc画像のピクセルを表します。

APIリンク/引用ではなく、 copySrcIntoDstAt(...)メソッドの正確な代替品を探していることに注意してください。

0 投票する
5 に答える
3393 参照

java - 画像を削除した後、JFrameが更新されない

JFrameで初めて画像を操作していますが、いくつか問題があります。JFrameに画像を配置することに成功しましたが、2秒後にJFrameから画像を削除したいと思います。しかし、2秒後、フレームのサイズを変更するか、最小化してからフレームを最大化しない限り、画像は消えません。できれば助けてください。ありがとう。

コードは次のとおりです。

System.out.println( "Picture" + f.getAbsolutePath()); BufferedImage image = ImageIO.read(f); MyBufferedImage img = new MyBufferedImage(image); img.resize(400、300); img.setSize(400、300); img.setLocation(50、50); getContentPane()。add(img);

this.setSize(600、400); this.setLocationRelativeTo(null); this.setVisible(true);

Thread.sleep(2000); System.out.println( "2秒以上");

getContentPane()。remove(img);

MyBufferedImageクラスは次のとおりです。

}

0 投票する
4 に答える
1932 参照

java - 別々のスレッドで BufferedImage の別々の領域を更新しても安全ですか?

インスタンスのコレクションBufferedImage、1 つのメイン イメージ、およびメイン イメージを呼び出すことによって作成されたいくつかのサブイメージがありgetSubImageます。サブイメージは重なりません。サブイメージにも変更を加えており、これをサブイメージごとに 1 つずつ複数のスレッドに分割したいと考えています。

BufferedImageどのように 、Rasterおよび動作するかについての私の理解からDataBuffer、これは次の理由で安全であるはずです。

  • BufferedImage(およびそれぞれのWritableRasterと)の各インスタンスは、SampleModel1 つのスレッドからのみアクセスされます。
  • 共有ColorModelは不変です
  • にはDataBuffer変更できるフィールドはありません (変更できるのはバッキング配列の要素だけです)。
  • 別々のスレッドで配列のばらばらなセグメントを変更することは安全です。

ただし、これを行うことが間違いなく安全であると述べているドキュメントは見つかりません。安全であると仮定できますか?child のコピーで作業できることはわかっていますがRaster、メモリの制約があるため、これは避けたいと思います。

それ以外の場合、親イメージの領域をコピーせずに操作をスレッドセーフにすることは可能ですか?

0 投票する
2 に答える
7685 参照

java - BufferedImage.getGraphics() でメモリ リークが発生しました。修正方法はありますか?

BufferedImage.getGraphics() メソッドを呼び出すフレームワーク API に問題があり、メモリ リークが発生しています。このメソッドが行うことは、常に BufferedImage.createGraphics() を呼び出すことです。Windows マシンでは、 createGraphics() は Win32GraphicsEnvironment によって処理され、フィールドdisplayChanger内にリスナーリストが保持されます。BufferedImage someChartで getGraphics を呼び出すと、someChartの SurfaceManager ( someChart への参照を保持する) がWin32GraphicsEnvironmentのリスナーマップに追加され、someChartがガベージ コレクションされるのを防ぎます。その後、someChartの SurfaceManager をリスナーマップ。

一般に、getGraphics が呼び出されると、BufferedImage がガベージ コレクションされるのを停止する要約されたパスは次のとおりです。

GC ルート -> localGraphicsEnvironment(Win32GraphicsEnvironment) -> displayChanger(SunDisplayChanger) -> listeners(Map) ->キー(D3DCachingSurfaceManager) -> bImg(BufferedImage)

フレームワークのコードを変更して、BufferedImage.getGraphics() を呼び出すたびに BufferedImage の SurfaceManager への参照を保持するようにすることもできました。次に、localGraphicsEnvironment を取得して Win32GraphicsEnvironment にキャストし、BufferedImage の SurfaceManager への参照を使用して removeDisplayChangedListener() を呼び出します。しかし、これは問題を解決するための適切な方法ではないと思います。

誰かがこの問題について私を助けてくれますか? どうもありがとう!


詳細と調査結果

UI に追加しようとしているコンポーネントは、再描画されるたびに BufferedImage.getGraphics() を呼び出します。その結果、displayChanger ( SunGraphicsEnvironment内) によって保持されるガベージの数は、コンポーネントが再描画されるにつれて増加するはずです。

ただし、物事は十分に奇妙に動作します。

確実に再描画をトリガーする UI でのアクションをカウントし、 displayChanger内のガベージ リスナーの数をカウントに対してチェックすると、それらは一致しません。(例: クリックする前に 8 人のリスナーがいて、60 回クリックしました。結局のところ、リスナーは 18 人しかいません。)

一方、ブレークポイントをオンにして、displayListenersに何かを追加するプロセスに進むと、クリックするたびに、 displayListenersに新しいエントリが作成されます。したがって、displayListenersが保持するすべての BufferedImageはガベージになります。

displayListeners のキーとして使用される SurfaceManager が共有または再利用される可能性があると考えましたが、私の実験ではその可能性は否定されました。キャッシングも検討し、repaint のすべての呼び出しを一意にすることで、意図的にキャッシングが発生しないようにしました。それでも、これがどのように発生するのか、またリークを解決する方法はわかりません。

0 投票する
2 に答える
15938 参照

java - TYPE_BYTE_GRAY を使用して、AWT を使用してグレースケールのバッファー イメージを効率的に作成する方法

nio ShortBuffer のデータからグレースケール イメージを作成する必要があります。ShortBuffer のデータを符号なしバイトにマップする関数がありますが、int です (簡単に変更できます)。私が見つけた方法は、RGB と透明度のカラー モデルを使用しており、非常に効率が悪いようです。TYPE_BYTE_GRAY を適用してコードを変更する方法を確認できませんでした。私はJavaが初めてです。これが私のコードです:

TIAネイト

0 投票する
1 に答える
269 参照

c# - より効率的なダブルバッファリングまたはバッファリングされたグラフィックスになる c# の重いグラフィックスアプリの場合?

こんにちは、重いグラフィックス アプリケーションを使用しています。グラフィックスを 2 ~ 10 秒で描画する必要があります。この時間は、UDP 経由でアプリケーションにデータを送信しているソース アプリケーションによって異なります。

私はいくつかの静的グラフィックを持っていますが、変更はありません。一部は半動的です。つまり、しばらく更新され、通常は変更されず、他のすべてのグラフィックは動的です。約8000個の動的なオブジェクトがあります。

私はC#で作業しており、タイトルに記載されている2つの手法を学びます。この場合、どちらがより効率的であり、助けが必要ですか

事前に感謝します。

0 投票する
2 に答える
749 参照

java - タイルで構成された BufferedImage で特定のタイルを回転させる

BufferedImage でタイルを回転させようとしています (bufferedimage はタイルで構成されています) が、スタックしてしまい、答えが見つからないようです。何時間もグーグル検索しましたが、チュートリアルが見つかりません。だから私は助けを求めてここに来ることにしました。

バッファリングされた画像の右下にある交差点(タイル)を回転させたいです。他のタイルが影響を受けないまま、90 度回転させたいと思います。

私はロボットの視覚化を行っているので、ロボットがレールの踏切に到達するたびに、踏切が 90 度回転し、別のレールに移動します。回転を単独でテストできるように、「回転」ボタンを追加しました。ボタンをクリックすると交差点が90度回転するようにしたいです。

これがコードです。コピーして実行できます。

開発環境 (Eclipse など) のイメージ フォルダーにイメージをコピーすることを忘れないでください。画像は 130 X 130 です。

以下の「VisPanel」クラスの画像の名前は次のとおりです。画像を「railHorizo​​ntal.JPG」、「railVertical2.JPG」、「railCrossing2.JPG」として保存します。

ここに画像があります。

代替テキスト http://www.freeimagehosting.net/uploads/ed6f294d32.jpg

代替テキスト http://www.freeimagehosting.net/uploads/dba1a7f996.jpg

代替テキスト http://www.freeimagehosting.net/uploads/f9d114ac1e.jpg

コード:

ご協力いただきありがとうございます。

0 投票する
2 に答える
7201 参照

java - Scala - 1 つの引数が null でなければならない場合に、使用するオーバーロードされたメソッドを明示的に選択する方法は?

全て、

BufferedImages と Raster オブジェクトを使用して、Scala で画像操作を行っています。次のコードを使用して、バッファリングされた画像のすべてのピクセルを取得しようとしています。

これで、比較的大きなファイルを読み込むと、これで問題なく動作します。20x20 の PNG ファイルを読み込むと、ArrayIndexOutOfBoundsException が発生します。

この問題を回避する方法は、pixelBuffer を事前に割り当てるのではなく、null 値を渡し、Raster.getPixels メソッドによって返された値を使用することであるとオンラインで読みました。

これが私の問題です。単純なアプローチを行い、最後の引数として Nil を渡すだけの場合:

エラーが発生します

したがって、コンパイラは、2 つのメソッドのどちらを呼び出そうとしているのかを判断できません。あいまいです。Java を使用している場合は、意図を明示するために null をキャストします。Scalaで同じ効果を得る方法がよくわかりません。私が試したこと:

Float 配列ではなく Int 配列を最後のパラメーターとして使用するメソッドが必要であることをコンパイラーに明示的に伝える方法はありますか?

編集:答えが指摘するように、私はNilをnullと混同していました。Nil は空のリストです。次のブログ記事を参照してください

また、配列の範囲外の例外は私のせいだったことを指摘しておく必要があります (これらはよくあることです)。問題は、ラスターに 3 つのチャネルがあると想定していたのに、そのように作成したため、イメージに 4 つのチャネルがあることでした。代わりに、次のように配列を事前に割り当てます。

助けてくれてありがとう

0 投票する
2 に答える
4231 参照

java - BufferedImages を別の BufferedImage に描画する最速の方法

Java で画像のモザイクを作成しようとしています。作成する新しい画像のサイズを計算し、モザイクの一部となる各サブ画像に対して、ペイント コールを実行します。

擬似コード:

これを行うより良い方法はありますか?サブイメージをより大きなイメージに変換またはスケーリングしたくないので、何らかの直接コピー操作が利用できることを願っています。各サブイメージのラスターの配列コピーに似たもの。Raster オブジェクトを受け取る setData メソッドがあることに気付きましたが、このメソッドは、Raster が同じ座標空間にある必要があることを示しています。

何かご意見は?これは私のプログラムのボトルネックであり、できるだけ高速にしたいと考えています。

編集:ボトルネックがどこにあるかについて、私が間違っていたことがわかりました(確かなデータなしで仮定が行われる場合によくあることです)。メモリにキャッシュされた画像の縮小版を使用するのではなく、複数の 3MB の画像が何度も何度も読み取られるというバグがありました。修正すると、実行時間が 50 分から 15 秒になりました。

0 投票する
1 に答える
1365 参照

java - Javaを使用して空白/非表示の画像を認識する方法

JavaのBufferedImageが空白(ブラウザのユーザーには表示されない)画像であることを認識できるかどうか疑問に思いました。