मैं article on Embarcadero के अनुसार बिटमैप की स्कैनलाइन तक पहुंचने का प्रयास कर रहा हूं।TBitmap की स्कैनलाइन पहुंच को सही ढंग से कैसे कार्यान्वित करें?
for y := 0 to n do
begin
line := bitmap.scanline [y];
for x := 0 to n do line [x] := value;
जैसे स्कैनलाइन का उपयोग करना मैंने पहले लागू किया है। मैंने देखा कि स्कैनलाइन तक पहुंचने में अपेक्षाकृत अधिक समय लगता है और ऊपर वर्णित आलेख उस पर समाधान प्रदान करता है। मैं इसे सही ढंग से लागू करने में सक्षम नहीं हूं। मेरा कोड है:
unit SCTester;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
ExtCtrls;
type
TRGBQuad = packed record
b: uInt8;
g: uInt8;
r: uInt8;
alpha: uInt8;
end; // Record: TQuad //
// Override the definitions in Graphics.pas
TRGBQuadArray = packed array [0..MaxInt div SizeOf (TRGBQuad) - 1] of TRGBQuad;
PRGBQuadArray = ^TRGBQuadArray;
TForm1 = class(TForm)
Image: TImage;
procedure ImageDblClick(Sender: TObject);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ImageDblClick(Sender: TObject);
var Bitmap: TBitmap;
q: TRGBQuad;
x, y: NativeInt;
FirstLine: PRGBQuadArray;
idx: NativeInt;
LineLength: NativeInt;
begin
q.r := 0; q.g := 0;
Bitmap := TBitmap.Create;
Bitmap.Height := Image.Height;
Bitmap.Width := Image.Width;
Bitmap.PixelFormat := pf32Bit;
FirstLine := Bitmap.ScanLine [0];
LineLength := (NativeInt (Bitmap.Scanline [1]) - NativeInt (FirstLine)) div SizeOf (TRGBQuad);
try
for y := Bitmap.Height - 1 downto 0 do
begin
for x := 0 to Bitmap.Width - 1 do
begin
q.b := (x xor y) mod 255;
idx := y * LineLength + x;
FirstLine [idx] := q;
end; // for
end; // for
Image.Picture.Assign (Bitmap);
finally
Bitmap.Free;
end; // try..finally
end;
end.
और y = 1 और x = 0 होने पर मुझे हमेशा अवैध पहुंच मिलती है। लाइन लम्बाई ऋणात्मक (बिटमैप की चौड़ाई) है, लेकिन इसकी अपेक्षा की जा सकती है। मैं क्या गलत कर रहा हूं?
संपादित करें: ऊपर दिए गए कोड को अब तक संसाधित टिप्पणियों को प्रतिबिंबित करने के लिए बदला गया है।
'' idx' NativeInt' के रूप में घोषित किया जाना चाहिए, तो अपने कोड 64 में रूप में अच्छी तरह से इस्तेमाल किया जा सकता है। 'लाइन लम्बाई' नकारात्मक नहीं होना चाहिए (इसलिए अवैध पहुंच)। मेरा निष्कर्ष यह है कि आप इस कोड को 64 बिट मोड में चला रहे हैं। –
@LURD, मेरे विचार बिल्कुल - और प्रत्येक LongInt (...) को मूल UInt (...) – kobik
@LURD रेखा लम्बाई नकारात्मक (और आमतौर पर नकारात्मक) हो सकती है, यह कोई समस्या नहीं है जो एवी का कारण बनती है। – kludg