Tôi có một mảng phẳng các giá trị byte RGB đi R1 G1 B1 R2 G2 B2 R3 G3 B3 ... Rn Gn Bn
. Vì vậy, dữ liệu của tôi trông giống như:Thuật toán để cắt các mặt phẳng (tại chỗ) ra khỏi một dãy các giá trị RGB
char imageData[WIDTH * HEIGHT * 3];
Nhưng tôi muốn chuyển mảng WIDTH * HEIGHT vào thư viện C hiện có dự kiến một mặt phẳng duy nhất của dữ liệu này. Đó sẽ là một chuỗi chỉ các giá trị R (hoặc chỉ là G, hoặc chỉ B).
Thật dễ dàng để phân bổ mảng mới và sao chép dữ liệu (duh). Nhưng hình ảnh rất lớn. Nếu nó không phải là một thư viện C nhưng đã lấy một số loại giao diện lặp lại để làm nổi bật quá trình truyền tải "cắt", điều đó sẽ rất tuyệt vời. Nhưng tôi không thể chỉnh sửa mã tôi đang gọi ... nó muốn một con trỏ cũ đơn giản đến một khối bộ nhớ tuần tự.
TÔI CÓ quyền truy cập ghi vào mảng này như thế nào. Nó là khả thi để tạo ra một thói quen mà sẽ sắp xếp nó thành máy bay màu. Tôi cũng cần một phép chuyển đổi ngược lại để đặt nó trở lại, nhưng theo định nghĩa, cùng một phương pháp sắp xếp nó thành các mặt phẳng có thể được áp dụng để hủy bỏ nó.
Làm thế nào hiệu quả tôi có thể (tại chỗ) biến mảng này thành R1 R2 R3 ... Rn G1 G2 G3 ... Gn B1 B2 B3 ... Bn
và sau đó quay lại? Bất kỳ thuật toán không ngây thơ?
Bạn đang nói về việc chuyển đổi ma trận 3xN. Các hoạt động chuyển vị ngây thơ là không hiệu quả vì nó đầy bộ nhớ cache bỏ lỡ. Google cho "chuyển đổi hiệu quả bộ nhớ cache". –
http://en.wikipedia.org/wiki/In-place_matrix_transposition#Algorithms – FUD
cũng thành thật mà nói tôi nghĩ bạn nên xem xét chỉ phân bổ bộ nhớ nhiều hơn .. một chuyển vị trí cho ma trận không vuông là khó chịu – FUD